【问题标题】:What's the point of using 'Any' in Swift? When to use 'Any' and when to use 'AnyObject'?在 Swift 中使用“Any”有什么意义?何时使用“Any”以及何时使用“AnyObject”?
【发布时间】:2014-07-05 15:40:13
【问题描述】:

In Swift documentation, it says the following:

Swift 提供了两个特殊的类型别名来处理非特定类型: AnyObject 可以表示任何类类型的实例。 Any 可以表示任何类型的实例,除了函数类型。 笔记 仅当您明确需要它们提供的行为和功能时才使用 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 的NSInteger,这是AnyObject 的子类型。 String/NSStringDictionary/NSDictionary 也是如此。我的猜测正确吗?然后,这是我的问题:

  • 即使你可以将 Swift 的 Array 定义为 AnyObject 并且仍然存储 Swift 的结构如 IntString,那么使用 Any 有什么意义呢?在任何情况下您必须将数组定义为AnyDictionary的值类型呢?

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

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

【问题讨论】:

  • 看起来这在种子 2 中发生了变化。我猜他们甚至不确定自己在做什么。
  • 我使用 Xcode 6 Beta 2。我还添加了import Foundation,但没有它,代码将被编译。

标签: ios objective-c swift


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果您没有import Foundation,则不会。不导入Foundation,会有很多错误。由于 Foundation 将数字类型桥接到 NSNumberStringNSString 等,它只会为您编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多