当尝试编译像这样的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
答案 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