这个[AnyObject] return 怎么会是AnyObject呢?
How can this [AnyObject] return as AnyObject?
import Cocoa
class Brain{
var internalProgram = [AnyObject]()
var program:AnyObject{
get{
return (internalProgram as AnyObject)
}
}
}
var savedProgram: AnyObject?
let brain = Brain()
func save(){
savedProgram = brain.program
}
这个 internalProgram:[AnyObject]
return 怎么能像 AnyObject
一样没有 Xcode 给出警告或错误呢?我知道 program
的类型已经设置为 AnyObject
,但我的意思是这怎么能起作用,它不应该是 [AnyObject]
吗?那么为什么没有任何警告或错误问题?
根据 Apple 的 文档,AnyObject
可以在以下情况下使用:
- you need the flexibility of an untyped object
- you use bridged Objective-C methods and properties that return an untyped result
它基本上可以用作任何 class 的任何实例的类型,无论那是什么。因此,[AnyObject]
,转换为NSArray
,仍然是一个对象,AnyObject
可以容纳,因为它的类型无关紧要,因为AnyObject
可以容纳任何class类型,例如NSArray
.
解释:
[AnyObject]
是一个对象数组,所以它是一个值类型。但是,当导入Foundation
时,数组可以自动转换为Objective-C桥接类型NSArray
即AnyObject.
So why no any warning or error issue?
如果你没有说 as AnyObject
:
class Brain {
var internalProgram = [AnyObject]()
var program: AnyObject {
get {
// compiler error:
// Return expression of type '[AnyObject]' does not conform to 'AnyObject'
return internalProgram
}
}
}
编译器告诉我们 [AnyObject]
不符合 AnyObject
– 这是完全正确的。 Swift Array
是 struct
,不是 class
,因此不能直接键入 AnyObject
.
然而,你接着说as AnyObject
。通过这样做,您 桥接 Swift Array
到 NSArray
(当 Foundation 被导入时) – 是 一个class
。因此它可以输入为 AnyObject
。您可以看到可以桥接到 here.
的基础类型的完整列表
此外,值得注意的是,在 Swift 3 中, 由于引入了不透明的 _SwiftValue
类型,它可以将任意 Swift 值包装在一个Obj-C 兼容框(包括 Array
未导入 Foundation 时)。
因为 anything 现在可以是 AnyObject
,它几乎是一个与 Any
一样弱的类型。最重要的是,它还允许你调用 any 已知的 @objc
方法,完全无视类型安全并且几乎肯定会给你带来 _SwiftValue
装箱问题.由于这些原因,您应该尽可能避免使用 AnyObject
。有 可供您使用。
import Cocoa
class Brain{
var internalProgram = [AnyObject]()
var program:AnyObject{
get{
return (internalProgram as AnyObject)
}
}
}
var savedProgram: AnyObject?
let brain = Brain()
func save(){
savedProgram = brain.program
}
这个 internalProgram:[AnyObject]
return 怎么能像 AnyObject
一样没有 Xcode 给出警告或错误呢?我知道 program
的类型已经设置为 AnyObject
,但我的意思是这怎么能起作用,它不应该是 [AnyObject]
吗?那么为什么没有任何警告或错误问题?
根据 Apple 的 文档,AnyObject
可以在以下情况下使用:
- you need the flexibility of an untyped object
- you use bridged Objective-C methods and properties that return an untyped result
它基本上可以用作任何 class 的任何实例的类型,无论那是什么。因此,[AnyObject]
,转换为NSArray
,仍然是一个对象,AnyObject
可以容纳,因为它的类型无关紧要,因为AnyObject
可以容纳任何class类型,例如NSArray
.
解释:
[AnyObject]
是一个对象数组,所以它是一个值类型。但是,当导入Foundation
时,数组可以自动转换为Objective-C桥接类型NSArray
即AnyObject.
So why no any warning or error issue?
如果你没有说 as AnyObject
:
class Brain {
var internalProgram = [AnyObject]()
var program: AnyObject {
get {
// compiler error:
// Return expression of type '[AnyObject]' does not conform to 'AnyObject'
return internalProgram
}
}
}
编译器告诉我们 [AnyObject]
不符合 AnyObject
– 这是完全正确的。 Swift Array
是 struct
,不是 class
,因此不能直接键入 AnyObject
.
然而,你接着说as AnyObject
。通过这样做,您 桥接 Swift Array
到 NSArray
(当 Foundation 被导入时) – 是 一个class
。因此它可以输入为 AnyObject
。您可以看到可以桥接到 here.
此外,值得注意的是,在 Swift 3 中,_SwiftValue
类型,它可以将任意 Swift 值包装在一个Obj-C 兼容框(包括 Array
未导入 Foundation 时)。
因为 anything 现在可以是 AnyObject
,它几乎是一个与 Any
一样弱的类型。最重要的是,它还允许你调用 any 已知的 @objc
方法,完全无视类型安全并且几乎肯定会给你带来 _SwiftValue
装箱问题.由于这些原因,您应该尽可能避免使用 AnyObject
。有