2014-10-29 61 views
0

我使用的功能String.withCString()如下:什么类型的函数输入到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'来输入'Result'

看看withCString的声明说:

func withCString<Result>(f: (UnsafePointer<Int8>) -> Result) -> Result 

我一直在解释说f参数是一个函数,它将UnsafePointer<Int8>作为输入并返回某种类型的结果。这就是我的第二个例子。第二个示例块有什么问题?

回答

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

+0

闭包类型声明''(cstr) - > UInt in'是完成这个工作所必需的。你知道为什么会这样吗?我期望's.withCString {println(“test”);返回strlen($ 0)}''和你的示例代码一样好。 – kubi 2014-10-29 15:14:36

+0

因为编译器不会假定返回类型,除非它是单表达式关闭。我认为,这是通过语言设计。 – rintaro 2014-10-29 16:29:37

相关问题