Arrays 这个[AnyObject]如何返回为AnyObject?
这个Arrays 这个[AnyObject]如何返回为AnyObject?,arrays,swift,casting,anyobject,Arrays,Swift,Casting,Anyobject,这个internalProgram:[AnyObject]如何返回为AnyObject,而没有Xcode发出警告或错误?我知道程序的类型已经被设置为任何对象,但我的意思是,这是如何工作的,它不应该是[AnyObject]?那么为什么没有任何警告或错误问题呢?根据苹果的文档,在以下情况下可以使用: 您需要非类型化对象的灵活性 使用桥接的Objective-C方法和属性返回非类型化结果 它基本上可以用作任何类的任何实例的类型,不管是什么。因此,转换为NSArray的[AnyObject]仍然是A
internalProgram:[AnyObject]
如何返回为AnyObject
,而没有Xcode发出警告或错误?我知道程序
的类型已经被设置为任何对象
,但我的意思是,这是如何工作的,它不应该是[AnyObject]
?那么为什么没有任何警告或错误问题呢?根据苹果的文档,在以下情况下可以使用:
- 您需要非类型化对象的灵活性
- 使用桥接的Objective-C方法和属性返回非类型化结果
NSArray
的[AnyObject]
仍然是AnyObject
可以保存的对象,因为它的类型无关紧要,因为AnyObject
可以保存任何类类型,例如NSArray
说明:
[AnyObject]
是一个对象数组,因此它是一种值类型。但是,当导入Foundation
时,数组可以自动转换为Objective-C桥接类型NSArray
,即任意对象
那么为什么没有任何警告或错误问题呢
如果你没有把说成任何对象
:
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
}
编译器告诉我们,[AnyObject]
不符合AnyObject
——这是完全正确的。Swift数组
是一个结构
,而不是类
,因此不能直接作为任何对象
键入
但是,您可以将称为AnyObject
。通过这样做,您可以将SWIFT <代码>数组< /代码>绑定到<代码> NSArray < /C> >(当基础被导入时)——这是<代码>类< /代码>。因此,可以将其键入为任何对象
。您可以看到可以桥接的基础类型的完整列表。
此外,值得注意的是,在SWIFT 3中,由于引入了不透明的<>代码> SwiftValue类型,它可以在Obj-C兼容的框中包括一个任意的SWIFT值(包括在未导入基础时的代码>数组< /代码>)。
因为现在任何东西都可以是
AnyObject
,所以它的类型与Any
一样弱。除此之外,它还允许您在其上调用任何已知的@objc
方法,完全不考虑类型安全性,并且几乎可以保证会导致\u SwiftValue
装箱问题。出于这些原因,应尽可能避免使用AnyObject
。任何对象都可以包含任何对象,包括AnyObject[AnyObject]return(internalProgram as!AnyObject)@leodbus的数组。更具体地说,它可以包含NSArray
。Swift数组不是任何对象
。我总是喜欢把写成NSArray
或写成NSString
而不是写成AnyObject
。这就是不关心类型的诅咒。;-)欢迎提出建议,如果您需要关于答案的澄清,请让我知道<代码>[AnyObject]是一种值类型,因此它不是只表示类类型的AnyObject
。但是,当导入Foundation
时,可以将Swift数组桥接到NSArray
,后者是AnyObject
。这是这里的重要部分。好的,我将用您提供的@Sulthan信息编辑答案。很高兴知道!Thanx!!!你的解释和提示对我(学习Swift的新手)来说太棒了!祝你度过愉快的一天,乐于帮忙,欢迎来到Stack Overflow@qasanto:)如果你觉得你的问题已经得到了回答,你可以。
class Brain {
var internalProgram = [AnyObject]()
var program: AnyObject {
get {
// compiler error:
// Return expression of type '[AnyObject]' does not conform to 'AnyObject'
return internalProgram
}
}
}