2017-01-01 167 views
4

这个函数在我没有实现它(一般用ints)的时候能够正常工作,但是当我去使它通用时,只更改几个没有明显的字母错误,Swift无法编译它;我甚至不使用func,只是让我的项目中的文件崩溃。Xcode 8.2 Swift编译器错误:“Segmentation Fault:11”

Xcode说:“发生了内部错误。”我检查了堆栈跟踪,错误列为“Segmentation Fault: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 
} 

回答

1

编译器不应该崩溃,无论是“错误”的源代码是怎么了, 那么你可以考虑提交一份bug报告。

在这种情况下,问题似乎是middleVal是计算的 属性。如果通过

//core code 
    if target > elements[middleIndex] { 
     leftIndex = middleIndex 
    }else { 
     rightIndex = middleIndex 
    } 

更换

//core code 
    if target > middleVal { 
     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

在我的情况在斯威夫特3环境中老斯威夫特2格式使用typealias的时候,比如我得到这个错误:

(Void -> Void) 而不是 (() ->())