String.withCString()的函数输入是什么类型的?

时间:2014-10-29 14:14:26

标签: swift

我正在使用函数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>作为输入并返回某种类型的函数。这是我的第二个例子。第二个示例块出了什么问题?

1 个答案:

答案 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