我正在使用函数String.withCString()
,如下所示:
let s = "Hey!"
let c = s.withCString {
strlen($0)
}
println(c)
但是,如果我在withCString闭包中添加第二行,则会出现错误
let s = "Hey!"
let c = s.withCString {
println("test")
strlen($0)
}
println(c)
错误是:“无法转换表达式的类型'(($ T4) - > $ T3) - >(($ T4) - > $ T3) - > $ T3'键入'结果' 。
查看withCString
的声明,它说:
func withCString<Result>(f: (UnsafePointer<Int8>) -> Result) -> Result
我一直在解释说f
参数将是一个以UnsafePointer<Int8>
作为输入并返回某种类型的函数。这是我的第二个例子。第二个示例块出了什么问题?
答案 0 :(得分:1)
你应该
let s = "Hey!"
let c = s.withCString { (cstr) -> UInt in
println("test")
return strlen(cstr)
}
println(c)
此声明:
func withCString<Result>(f: (UnsafePointer<Int8>) -> Result) -> Result
表示返回类型withCString
是参数f
的返回类型。
你的第一个例子:
let c = s.withCString {
strlen($0)
}
闭包只有一个表达式,这会导致"Implicit Return",编译器可以将它的返回类型确定为UInt
。
第二个有两个陈述。那么你必须明确声明返回类型和return
。