斯威夫特:为什么要诠释!成员实例更改为int?阻止?

时间:2018-08-30 14:05:09

标签: ios swift

我定义了一个成员实例frameCount,其类型为Int!,但是当我在块中引用它时,其类型变为Int?。如果我不解包,Xcode将提示compile错误“可选类型'Int?的值'。没有包装;您的意思是使用'!'或“?”?”。

我可以使用它而不会解开块。

//Without unwrapping
self.frameCount = self.frameCount + 1
optQueue.async { [weak self] in
    //frameCount become Int?.
    //If I doesn't unwrap it Xcode will prompt complie error "Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?"
    self?.frameCount = (self?.frameCount)! + 1;
}

3 个答案:

答案 0 :(得分:3)

您的变量不是可选的!您的self是。由于您正在执行异步调用,因此在执行完成操作时self可能会不复存在。因此,您将其捕获为weak。但是,如果您希望它强制运行,则可以删除[weak self],但它将强烈引用self并防止其被释放。因此,如果不调用您的完成功能,它将永远不会被释放。

答案 1 :(得分:2)

这里self是可选的,而不是frameCount,您可以使用guard来避免这种情况,因为您可能有很多需要访问self的东西,而不是强制使用-全部展开

optQueue.async { [weak self] in
   guard let strongSelf = self else { return }
   strongSelf.frameCount += 1
}

答案 2 :(得分:1)

此外,您可以将weak self替换为unowned self,因此您对self的引用仍然较弱,但对可选self的引用却很弱。 但是,请谨慎使用该方法,如果self将在执行完成之前被释放,则可能导致崩溃。

optQueue.async { [unowned self] in
    self.frameCount = self.frameCount + 1
}