我使用的是Xcode6-beta2,但自从第一次公开测试以来,我就遇到了同样的问题.我的Obj-C UIViewController的Swift子类如下所示:

class SomeVC: UIViewController {
    var c1: () -> () = {
        println(self)
    }

    var c2: () -> () {
        get {
            return { println(self) }
        }
    }

    var c3: () -> () {
        return { println(self) }
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        c1()
        c2()
        c3()
    }
}

当显示VC时,我看到以下几行打印出来:

(Function)
<_TtC12SwiftiOSTest6SomeVC: 0x10bf1ed10>
<_TtC12SwiftiOSTest6SomeVC: 0x10bf1ed10>

(c2和c3的不同之处在于,不必包含get{…}对于仅可获取的计算(computed)属性.)

因此,第一个闭包的self似乎指的是函数/闭包类型本身,而其他闭包的self则指的是视图控制器(正如我所预期的).

这是某个地方记录的东西(我读了Swift的书,没有发现任何东西),还是只是某种beta编译器错误,应该在某个地方存档?

推荐答案

这看起来很有趣,所以我再深入一点.我们发现,您可以访问闭包中的类实例变量,比如self.instanceVariable.然后,封盖将覆盖其中的self.现在self指的是类实例本身.你的关闭应该是一个lazy属性.

lazy属性意味着您可以在默认闭包中引用self,因为只有在初始化完成并且知道self存在之后,才会访问lazy属性.

You are missing @lazy so that self is unknown to the closure thats why it is printing it as (Function) my guess.

class TableViewController: UIViewController {
var name = "anil"
// Since swift 2.0 came out @lazy is replaced by lazy
lazy  var c1: () -> () = {
    println(self)
    println(self.name)

}

var c2: () -> () {
get {
    return { println(self) }
}
}

var c3: () -> () {
return { println(self) }
}


  override func viewDidLoad() {
        super.viewDidLoad()
        c1()
        c2()
        c3()
        }
}

输出

<_TtC12TableViewApp19TableViewController: 0x10d54e000>
anil
<_TtC12TableViewApp19TableViewController: 0x10d54e000> <_TtC12TableViewApp19TableViewController: 0x10d54e000>


Update

将闭包赋给类实例变量会导致强引用循环.你应该避免这样.Swift 用了Capture list

如果将闭包分配给类实例的属性,并且闭包通过引用该实例或其成员来捕获该实例,则将在闭包和实例之间创建一个强引用循环.Swift使用捕获列表来打破这些强引用循环.有关更多信息,请参阅Strong Reference Cycles for Closures.

所以闭包的正确用法可能是

@lazy  var c1: () -> () = {
    [unowned self] in
    println(self)
    println(self.name)

}

参考:Swift programming guide

Edit
@lazy has been changed to lazy

Swift相关问答推荐

多个提取来计算核心数据中的记录

如何在向照片添加文本时定义文本对齐、文本背景的Alpha和在文本之前添加图像

传递给SWIFT ResultBuilder的闭包中结果类型的对象

带DispatchSourceTimer的定时器

如何才能在同一线程上调用类中的每个方法,而不对每个调用使用同步块?

为什么我不能在这个 Swift 间接枚举中返回 self ?

关闭 SwiftUI TabView 中的子视图

CardStack 和 Lottie

为什么我在我的 Swift iOS 应用程序项目中收到 Xcode 中的错误消息无法识别的 Select 器发送到类?

Swift-如何接受多个(联合)类型作为参数

如何让动画变慢 SwiftUI

在 Swift 4 中实现自定义解码器

我将哪种 Swift 数据类型用于货币

AES 加密和解密

在运行时访问 UIView 宽度

SwiftUI 中的 .primary 和 .secondary colored颜色 是什么?

如何在 Swift 中将对象归零

iOS 视图可见性消失了

Swift UITableView reloadData 在一个闭包中

滑动侧边栏菜单 IOS 8 Swift