Swift中IIFE的类型推断

Swift中IIFE的类型推断,swift,iife,Swift,Iife,IIFE(立即调用的函数表达式)是JavaScript中大量使用的模式。 斯威夫特看起来也支持这一点。像这样: let one = { 1 } /// one: () -> Int 显式类型声明函数和常量返回函数运行良好 let one:Int = { $0 }(1) /// one: Int 但常量returnd函数不能推断为自己的类型 let one = { $0 }(1) /// SourceKitService /// Terminated /// /// Editor

IIFE(立即调用的函数表达式)是JavaScript中大量使用的模式。 斯威夫特看起来也支持这一点。像这样:

let one = { 1 }
/// one: () -> Int
显式类型声明函数和常量返回函数运行良好

let one:Int = { $0 }(1)
/// one: Int
但常量returnd函数不能推断为自己的类型

let one = { $0 }(1)
/// SourceKitService
///    Terminated
///
/// Editor functionality
/// temporarily limited.
我强迫它像贝壳一样运行

//斯威夫特先生

#!/usr/bin/xcrun swift

var i:Int = 0
let id = { $0 }(i)

println(id)
当强调纺织silgen closureexpr SIL函数时,@_TF8inferredU_FRSiSi用于[./inferred.swift:4:10-line:4:15]RangeText=“{$0}” [1] 29364分段故障。/r.swift

#!/usr/bin/xcrun swift

var i:Int = 0
let id = { $0 }(i)

println(id)

有什么东西我错过了还是我弄错了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
声明
i
,则不行。(任何时候当您看到编译器或SourceKit崩溃时,您都可以使用它。)


调用闭包可以很好地设置延迟初始化的存储属性——针对属性的第一个get运行闭包。例如,您会在用于设置核心数据堆栈的Xcode项目模板中注意到它们:

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
,所以它的返回类型必须是可选的,但类型检查器无法判断哪种类型是可选的。

这看起来像是编译器崩溃。您使用的是哪个版本的Xcode?@tng beta 5。latestit编译器刚刚被它拥有的这么多选项弄糊涂了。代码中没有错误,除了