当我不通用地实现它(仅使用 ints)时,这个函数可以正常工作,但是当我去让它通用时,只更改几个字母而没有明显的错误,Swift 无法编译它;我什至不使用 func,只需将文件放在我的项目中就会崩溃。
Xcode说"发生了内部错误"。我检查了堆栈跟踪,错误列为"分段错误:11"。我将在下面发布我的代码。
我还可以根据要求发布堆栈跟踪。
import Foundation
func BinSearch<T : Comparable>(elements: [T], target: T) -> Int?{
let maxIndex = elements.count - 1
var rightIndex = maxIndex
var leftIndex = 0
var middleIndex : Int {return lround(Double((rightIndex + leftIndex)) / 2)}
var maxVal : T {return elements[rightIndex]}
var middleVal : T {return elements[middleIndex]}
var minVal : T {return elements[leftIndex]}
while elements[middleIndex] != target {
//test if in infinite loop for target within range of array but DNE
if leftIndex == middleIndex || rightIndex == middleIndex && rightIndex != 1{
return nil
}
//prevent infinite loop due to rounding method
if rightIndex == 1 {
return leftIndex
}
//core code
if target > middleVal {
leftIndex = middleIndex
}else {
rightIndex = middleIndex
}
}
return middleIndex
}
编译器不应该崩溃,无论源代码多么"错误",因此,您可以考虑提交错误报告。
在这种情况下,问题似乎是middleVal
是计算的财产。如果替换
//core code
if target > middleVal {
leftIndex = middleIndex
}else {
rightIndex = middleIndex
}
由
//core code
if target > elements[middleIndex] {
leftIndex = middleIndex
}else {
rightIndex = middleIndex
}
然后代码编译。但是,它不能正常工作。例如
BinSearch(elements: [3, 4, 5], target: 2)
返回 0
而不是 nil
。(我也认为使用没有优势计算middleIndex
和middleVal
的属性。 代码中根本不使用maxVal
和minVal
。
下面是一个正常工作的实现示例(灵感来自 http://rosettacode.org/wiki/Binary_search#Swift):
func binarySearch<T : Comparable>(elements: [T], target: T) -> Int? {
var leftIndex = 0
var rightIndex = elements.count - 1
while leftIndex <= rightIndex {
let middleIndex = (leftIndex + rightIndex) / 2
if elements[middleIndex] < target {
leftIndex = middleIndex + 1 // Continue search in upper half.
} else if target < elements[middleIndex] {
rightIndex = middleIndex - 1 // Continue search in lower half.
} else {
return middleIndex // Found.
}
}
return nil // Not found.
}
就我而言,在 Swift 3 环境中使用旧 Swift 2 格式的 typealias
时,我遇到了此错误,例如:
(Void -> Void)
而不是 (() -> ())