当尝试编译像这样的 Swift 文件(作为项目的一部分)时,Xcode(版本 7.3.1)在为“operationForOperationType”发出 SIL 时抛出段错误 11 '
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
最佳答案
首先:如果编译器崩溃,您可能需要向苹果提交错误报告。
其次关于您的代码:我花了一段时间才弄清楚这里出了什么问题!您声明的返回类型不是闭包!
func operationForOperationType() -> ([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
关于ios - 在 Xcode 中使用枚举编译 swift 文件时出现段错误 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37512108/