Xcode 8.2 Swift编译器错误:"分段错误:11"

时间:2017-01-01 20:15:38

标签: swift xcode generics compiler-errors segmentation-fault

当我没有一般地实现它(只是使用整数)时,这个函数可以正常工作,但是当我把它变成泛型时,只更改几个没有明显错误的字母,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
}

2 个答案:

答案 0 :(得分:1)

无论源代码有多么“错误”,编译器都不应该崩溃, 所以你可以考虑提交错误报告。

在这种情况下,问题似乎是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。 (我也认为使用没有优势 计算middleIndexmiddleVal的属性。 您的代码中根本不使用maxValminVal。)

以下是正确工作实施的示例 (受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.
}

答案 1 :(得分:1)

就我而言,在Swift 3环境中使用旧的Swift 2格式的typealias时出现此错误,例如:

(Void -> Void) 代替 (() -> ())