【发布时间】:2014-08-20 17:57:42
【问题描述】:
所以我在 Swift 中玩惰性实例化,并尝试在 swift 中完全复制以下 Objective C 范式
//A Getter for a strong property
- (SomeObject)lazilyLoadedObject {
if (!_lazilyLoadedObject) {
_lazilyLoadedObject = [[SomeObject alloc] init];
__weak typeOf(self) weakSelf = self;
_lazilyLoadedObject.blockProperty = ^(){//Some block which relies on weakSelf};
}
return _lazilyLoadedObject;
}
然后我尝试执行以下操作,并惊讶地发现编译失败并显示 Global is external, but doesn't have external or weak linkage!
lazy var lazilyLoadedObject: SomeObject = {
var instance = SomeObject()
instance.closureProperty = {[weak self] in
//Do something with weak self
}
return instance
}()
所以我的第一个问题是,当我们需要对 self 的引用时,上述用于惰性实例化的 sn-p 有什么问题?
确定之后我遇到了以下 sn-p(主要是由于代码完成)。
lazy var lazilyLoadedObject: SomeObject = instantiateLazilyLoadedObject(self)()
func instantiateLazilyLoadedObject() -> SomeObject {
var instance = SomeObject()
instance.closureProperty = {[weak self] in
//Do something with weak self
}
return instance
}
这到底是什么^ (self)()?一点谷歌搜索表明这是一个“咖喱函数”,但我真的不明白。什么方法将 self 作为参数并返回一个函数?是不是有些东西被抽象掉了,还有另一层我没有看到(也许有一种更冗长的方式来写这个?)。最后,这是将目标 C 的顶部片段转换为 swift 的正确方法吗?
【问题讨论】:
标签: swift