如果闭包只包含一个表达式,则它的返回类型将自动推断,例如:
static var jsonURLNL = { return URL(string: "professionalURL")! }()
或者如果调用上下文可以推断出类型:
static var jsonURLNL: URL = {
if ProcessInfo.processInfo.environment["CONSUMER"] != nil {
return URL(string: "consumerURL")!
}
return URL(string: "professionalURL")!
}()
或者
static var jsonURLNL = {
if ProcessInfo.processInfo.environment["CONSUMER"] != nil {
return URL(string: "consumerURL")!
}
return URL(string: "professionalURL")!
}() as URL
简化示例: 这个单表达式闭包可以编译:
let cl1 = { return 42 }
但是这个多表达式闭包不行:
let cl2 = { print("Hello"); return 42 }
// error: unable to infer complex closure return type; add explicit type to disambiguate
以下代码可以编译通过,因为类型可以从上下文中推断出来:
let cl3 = { print("Hello"); return 42 } as () -> Int
let y1: Int = { print("Hello"); return 42 }()
let y2 = { print("Hello"); return 42 }() as Int
另请参阅来自Jordan Rose的引用在这个邮件列表讨论中:
Swift的类型推断目前是以语句为导向的,因此没有简单的方法来进行[多语句闭包]推断。这至少在编译时间上是一个问题:Swift的类型系统允许进行比Haskell或OCaml等语言多得多的转换,因此解决整个多语句函数的类型并不是一个轻松的问题,可能不是一个可行的问题。
和SR-1570 bug报告。
(两个链接和引用都从How flatMap API contract transforms Optional input to Non Optional result?复制而来)。