Swift 中的奇怪类型数组

Posted

技术标签:

【中文标题】Swift 中的奇怪类型数组【英文标题】:Strangely typed Array in Swift 【发布时间】:2014-12-09 09:32:41 【问题描述】:

我开始学习 Swift,但遇到了 Swift 的 Array 类的奇怪行为,没有记录,或者至少我在任何地方都没有找到它。

当我像这样创建Array 时:

var myRegularArray: Array = [Int]()

或者像这样:

var myRegularArray: Array = [1, 2, 3]

然后一切都按照书本进行:数组是通过常规语法创建的,并且是已定义的类型等。

但是

当我输入这样的内容时:

var myStrangeArray = ["Some text", 42]

编译器将此视为NSObject 实例,而不是Array 甚至NSArray。如果我使用这种语法会发生什么,为什么不是Array 实例?

【问题讨论】:

不是NSObject 而是[NSObject]Array<NSObject> 同意 rintaro。 啊,所以如果我创建像 Array<NSObject> 这样的数组,Apple 关于强类型数组的评论毫无意义? @rintaro,请您写一个答案,以便我选择它作为答案吗? 【参考方案1】:

不是NSObject 而是[NSObject]Array<NSObject>

那么为什么编译器将其推断为Array<NSObject>?因为NSObject是元素的唯一通用类型。

在这种情况下,"Some text" 被推断为NSString42 被推断为NSNumber。而NSObject 是它们最近的也是唯一的共同祖先。

【讨论】:

但是当我将它放入这样的数组时,为什么我不能访问 NSDate 元素:let date: NSDate = NSDate()var myRegularArray: [NSObject] = [1, "text", date]println(variable[2]) 为什么是variable[2],而不是myRegularArray[2]println(myRegularArray[2]) 打印 2014-12-09 10:19:57 +0000 或其他东西。 你可以。但是您需要将其转换为 NSDate 才能将其作为日期处理。 让我印象深刻的另一件事...如果您想在其中放入不同的东西,您确定数组是正确的数据结构吗?也许一个元组会更合适? @rintaro 是的,我的错,没有注意到。但是,所有这一切都意味着我们实际上可以拥有我们习惯于 Objective-C 的数组,而无需 Apple 告诉我们所有数组都应该明确告知它们使用哪种类型的限制?【参考方案2】:

您使用Any还是AnyObject取决于您的预期用途:

如果您的 dictionary 将仅在 Swift 代码中使用,那么您应该使用 Any,因为您的类型 (Int、Double、Float、String、Array 和 Dictionary) 不是对象。

如果您要将您的字典传递给期望NSDictionary 的Objective-C 例程,那么您应该使用AnyObject

当您导入 Foundation 或导入 UIKit 或导入 Cocoa 时,可以将您的 array 声明为 [String: AnyObject],但在这种情况下,Swift 会将您的 Int, Double, Float literals as NSNumber,您的 Strings 视为NSString,您的 ArraysNSArray,您的 dictionariesNSDictionary,所有这些都是对象。使用AnyObject 作为值类型的字典可以转换为NSDictionary,但使用Any 的字典则不能。

我们必须告诉编译器,我们应该在初始化时需要无类型数组。

尝试以下将消除您的编译时错误

 var myStrangeArray :[Any] = ["Some text", 42]

【讨论】:

【参考方案3】:

在前两个示例中,它告诉编译器您想要一个包含整数([Int] 或 [1,2,3])的数组,但是当您创建 myStrangeArray 时,您首先传递两种不同的类型,一个是字符串,另一个是整数所以编译器正在使用 NSObject:[NSObject] 创建数组。 如果您将声明更改为: var myStrangeArray = [1, 42] 它将是整数数组:[Int]。

【讨论】:

但据我所知,它并没有创建数组,而是创建了 NSbject 实例而不是数组,这很奇怪,这让我很好奇。 你确定吗?我试过了,它创建了 [NSObject] 类型,它是数组。 是的,你是对的,它是一个包含 NSObject 实例的数组,就像@rintaro 所说的

以上是关于Swift 中的奇怪类型数组的主要内容,如果未能解决你的问题,请参考以下文章

iOS8/Swift 奇怪的空行为与来自 REST 服务的响应

在 Swift 中使用 Alamofire 发送包含字典对象数组的字典对象时会发生奇怪的行为?

Swift 中的 DateComponents 返回奇怪的值。为啥?

NSManagedObjectContext 扩展中泛型函数中的奇怪 Swift 行为

为啥 Swift4 会强制转换 UIButton 数组!到 [UIButton?] 类型?

调用 setNeedsDisplay 时的 Swift 奇怪行为