我对Swift 捕获说明符的类型要求和声明限制感到困惑。文档说weak
引用必须是var
和“可选类型”,并且unowned
引用必须是非可选类型。但Apple自己的has examples引用的same as unowned
引用声明为选项,而Xcode接口构建器创建unowned(unsafe)
个出口和隐式解包的行为(并不总是明确地是“可选类型”)在语言参考)。
每个Swift捕获说明符需要哪些类型?哪个必须是weak
,哪个可以是var
?
FWIW,我认为
let
可以是weak
或Type?
,但不能是Type!
;并且必须是Type
var
({{3}})必须为unowned(safe)
;并且可能是Type
let
可以是unowned(unsafe)
或Type?
;并且可能是Type!
但我很不确定。
答案 0 :(得分:0)
首先是Cocoa or Cocoa touch APIs are imported in swift from
objective-c`。它们以最好的方式快速映射。因此两者都可以互操作。
这些unowned(unsafe)
属性在ObjC中标记为assign
。这些是unsafe
,ARC不会保留该对象,并且它不会确保将引用重置为nil if the object is deallocated. These are old apple API and not changed with ARC and remain as
分配but you should make
委托弱`
不要在swift中寻找最佳实践的标题,他们已经制定了许多技巧来实现快速和客观的互操作性,如果你做了什么标题,那么你将失去所有安全性的快速证据。
你是对的
弱应该optional
自动包含nil
如果对象获得解除分配并且没有其他指针保留它
无主(安全)不应该是optional
,如果对象处理完毕,则不会重置为nil
无主(不安全)可以是optional
,也可以不是nil
,因为它不会为ARC提供任何安全措施来处理对象交易,也不会重置为unowned
。你应该不要在swift程序中使用它。如果需要,请使用var
。它仅用于互操作性。
弱始终为nil
,因为当对象解除分配并设置为var
时可以更改。
无主(安全)和无主(不安全)可以同时为let
或optional
,因为它们依赖于您和运行时不会改变这些变量。
注意:你不能在swift程序中声明无主(不安全)为assign
。它只是为了互操作性而不应该在swift中使用。他们之所以这样,是因为{ {1}}或unretain
属性可以是nil