【发布时间】:2015-02-27 03:53:10
【问题描述】:
我在 swift 中有一个惰性属性,它有一个看起来像这样的回调。
lazy var apiClient: MyApiClient =
{
var apiClient : MyApiClient = MyApiClient()
apiClient.detailSearchFinishedCallBack = {
(detailModel : DetailModel!) in
}
return apiClient
}()
我想在闭包内访问另一个延迟加载属性,如下所示:
lazy var loadingView : LoadingView =
{
var loadingView : LoadingView = LoadingView()
loadingView.frame = CGRectMake(0, 0, 200, 200)
loadingView.center = self.view.center
return loadingView
}()
但是,我无法引用闭包内的加载视图。在目标 c 中,这看起来像这样。
-(LoadingView *)loadingView
{
if(!_loadingView)
{
_loadingView = [LoadingView new];
_loadingView.frame = CGRectMake(0, 0, 200, 200);
_loadingView.center = self.view.center;
}
return _loadingView;
}
-(MyApiClient *)apiClient
{
if(!_apiClient)
{
_apiClient = [MyApiClient new];
__weak FeedViewController *_self = self;
self.apiClient.detailSearchFinishedCallBack = ^(DetailModel *detailModel)
{
[_self.loadingView stopAnimating];
};
}
return _apiClient;
}
有人愿意向我展示 Swift 中的等价物吗?
更新:
lazy var apiClient: MyApiClient = {
let apiClient: MyApiClient = MyApiClient()
apiClient.detailSearchFinishedCallBack = { [weak self] (detailModel: DetailModel!) in
println(self?.loadingView.frame)
return
}
return apiClient
}()
所以我继续尝试实施建议的解决方案,但出现编译错误。具体来说,我遇到了这个错误:
命令 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc 失败,退出代码为 1
我不确定这是否与我在项目中的 swift 配置有关,但我正在使用桥接头导入我的目标 c 头文件以暴露给 Swift。我想不出任何其他可能导致此问题的原因,但我们将不胜感激任何帮助来解决此问题。
【问题讨论】:
-
@MikeTaverne 如果您引用其他文章的目的是解决
weakSelf模式,我认为这不是这里的关键问题。我认为问题在于在引用另一个属性的闭包中配置了变量的默认值。就个人而言,当这种相互依赖存在时,我放弃了默认值的闭包,将其移至init和/或viewDidLoad酌情。这样就绕过了问题。 -
@Rob 我相信你对此的判断。我自己没有尝试过,但你的解释是有道理的。谢谢。
-
更新确实提出了“自我”指的是什么问题。它可能应该是 apiClient 并且无权访问“loadingView”,不是吗?
-
@zic10 顺便说一句,您提到了编译器崩溃。是的,当使用闭包为属性提供默认值时,我注意到了隐秘且莫名其妙的崩溃。更糟糕的是,在我的测试中(使用单例模式),问题并不总是可复制的。我不认为 Swift 将闭包作为默认值的实现非常健壮。
标签: ios objective-c xcode swift