IIFE(立即调用的函数表达式)在 JavaScript中使用了很多模式. 斯威夫特也看起来像支持那样.像这样: let one = { 1 }/// one: () - Int 显式类型声明和常量复原函数效果很好. let one:Int = { $0 }(1)//
斯威夫特也看起来像支持那样.像这样:
let one = { 1 } /// one: () -> Int
显式类型声明和常量复原函数效果很好.
let one:Int = { $0 }(1) /// one: Int
但恒定返回功能不能推断出自己的类型.
let one = { $0 }(1) /// SourceKitService /// Terminated /// /// Editor functionality /// temporarily limited.
我强迫像shell一样运行它.
// inferred.swift
#!/usr/bin/xcrun swift var i:Int = 0 let id = { $0 }(i) println(id)
Whemphasized textile silgen closureexpr SIL function @_TF8inferredU_FRSiSi for expression at [./inferred.swift:4:10 – line:4:15] RangeText=”{ $0 }”
[1] 29364 segmentation fault ./inferred.swift
有什么我错过或做了我有错误的styntax?
我相信我已经看到一些东西将Swift的这个构造的实现称为“被称为闭包”,但我现在没有找到它.请注意你的第一个例子:
let one = { 1 }
……不是一个叫做封闭的东西.它定义了一个闭包,但没有调用它.因为它没有参数,所以在通过在大括号后放置一个空参数列表来定义它的同时调用它:
let one = { 1 }()
您也可以使用类型推断来执行此操作:
let one = { $0 }(1) // one: (Int) = 1 let i = 1 // i: Int = 1 let one = { $0 }(i) // one: (Int) = 1
这些对我来说在beta 5上工作,但不是如果我用var而不是let声明. (每当你看到编译器或SourceKit崩溃时,它可能对file a bug有好处.)
被调用的闭包对于设置延迟初始化的存储属性非常有用 – 第一个针对属性的get运行闭包例如,您将在Xcode项目模板中注意到它们用于设置Core Data堆栈:
lazy var managedObjectContext: NSManagedObjectContext? = { // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. let coordinator = self.persistentStoreCoordinator if coordinator == nil { return nil } var managedObjectContext = NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator = coordinator return managedObjectContext }()
在这种情况下,必须明确给出类型 – 因为闭包可以返回nil,它的返回类型必须是可选的,但类型检查器不能告诉什么类型的可选.