在Xcode中使用枚举编译swift文件时的分段错误11

时间:2016-05-29 16:10:21

标签: ios xcode swift segmentation-fault

当尝试编译像这样的Swift文件(作为项目的一部分)时,Xcode(版本 7.3.1 )会引发分段错误11 while emitting SIL for 'operationForOperationType'

import Foundation

enum OperationType: String{
    case Addition = "∑"

    func operationForOperationType() -> ([Double], [[Double]]? -> Double){
        switch self {
            case OperationType.Addition:
                return {$0.reduce(0, combine: {$0 + $1})}
        }
    }
}

这是编译器错误还是实际上是给定代码的结果?代码的其他变体(不止一种情况,切换给定的OperationType而不是self)也会导致分段错误11。

修改:删除.output(复制粘贴错误)

编辑II:该函数的目的是返回给定OperationType的闭包。例如,如果我的OperationType是添加的,我希望它返回在数组中添加元素的闭包。当然,这是一种简化。可能会发生,我希望返回一个闭包,它结合了数组中的元素和二维数组(想想矩阵 - 向量乘法与后来的点积)。

用法可能是,例如:

var op = OperationType.Addition
let f = op.operationForOperationType()
let arr: [Double] = [1, 5, 2]
f(arr, nil)
//-> 8

1 个答案:

答案 0 :(得分:1)

首先关闭:如果编译器崩溃,您可能想向Apple提交错误报告。

其次关于你的代码:我花了一些时间来弄清楚这里有什么问题!您声明的返回类型是不是一个闭包!

func operationForOperationType() -> ([Double], [[Double]]? -> Double) {

此行表示该函数返回一个[Double]的元组和一个类型为[[Double]]? -> Double的闭包。 会返回一个输入为[Double][[Double]]?并且返回Double的闭包。

要更正返回类型以实际指定返回只是一个你必须写的闭包:

func operationForOperationType() -> ([Double], [[Double]]?) -> Double {

请注意已移动的结束)

现在我们可以实现返回值的实际实现:

func operationForOperationType() -> ([Double], [[Double]]?) -> Double {
    switch self {
    case OperationType.Addition:
        return { (a, b) in a.reduce(0, combine: {$0 + $1})}
    }
}

由于我们将输入定义为([Double], [[Double]]?)类型的元组,我们必须通过$0.0$0.1访问这些参数,或者我们写(a, b) in来映射第一个元组值为a,第二个元组值为b

现在一切都在编译。我仍然不知道你想对b做什么,但这对我的业务来说没有;)

全部放在一起:

enum OperationType: String{
    case Addition = "∑"

    func operationForOperationType() -> ([Double], [[Double]]?) -> Double {
        switch self {
        case OperationType.Addition:
            return { (a, b) in a.reduce(0, combine: {$0 + $1})}
        }
    }
}

var op = OperationType.Addition
let f = op.operationForOperationType()
let arr: [Double] = [1, 5, 2]
f(arr, nil) // actually outputs 8 now