Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 这个[AnyObject]如何返回为AnyObject?_Arrays_Swift_Casting_Anyobject - Fatal编程技术网

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
        }
    }
}