什么是使用'任何'在斯威夫特?何时使用'任何'何时使用' AnyObject'?

时间:2014-07-04 08:59:21

标签: ios objective-c swift

In Swift documentation, it says the following

Swift提供了两种特殊类型的别名,用于处理非特定类型: AnyObject可以表示任何类类型的实例。 除了函数类型之外,任何可以表示任何类型的实例。 注意 仅当您明确需要它们提供的行为和功能时才使用Any和AnyObject。最好具体了解您希望在代码中使用的类型。

如果我理解正确,AnyObject应该在与类类型兼容时使用,这意味着它不能代表Swift的内置StringIntDictionaryArray等等......因为这些都在Swift中表示为结构,而不是类。

但是,当我编写以下代码时,可以编译它而没有任何错误:

var myInt: Int = 10
var myStr: String = "st"
var myDict:Dictionary<String, AnyObject> = ["k1": "1", "k2": 2, "k3": true]
var myArr:Array<AnyObject> = []
myArr.append(myInt)
myArr.append(myStr)
myArr.append(myDict)
println(myArr)

因为我将myArr定义为AnyObject[],所以它应该只能包含类类型,而myIntmyStrmyDict都是兼容的到Any,而不是AnyObject,而Any与`AnyObject不兼容。

但是,我认为可以编译它的原因是因为myInt可以在内部转换为Objective-C&#39; NSInteger,这是AnyObject的子类型。 String / NSStringDictionary / NSDictionary也是如此。我猜是正确的吗?然后,这是我的问题:

  • 即使您可以将Swift的数组定义为AnyObject并仍然存储Swift的结构,例如IntString,那么&#39; s使用Any的关键点?是否有任何情况需要将数组定义为AnyDictionary的值类型怎么样?

  • 我应该如何决定何时使用Any以及何时使用AnyObject,特别是如果我处理的类型可以转换为Objective-C的对象,例如StringIntDictionary等?

我认为Cocoa和Cocoa Touch中的大多数方法都返回AnyObject!,而不是Any!。所以我想知道在Swift的数组和字典的值类型中使用Any的最佳情况是什么。

2 个答案:

答案 0 :(得分:1)

您可以使用Any []存储自定义结构。

答案 1 :(得分:1)

  

但是,当我编写以下代码时,可以在没有编译的情况下进行编译   任何错误:

如果您没有import Foundation,则不会。没有导入Foundation,就会出现很多错误。它只会为您编译,因为基金会对NSNumberStringNSString等数字类型进行了桥接。