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"
被推断为NSString
,42
被推断为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
,您的 Arrays 为 NSArray
,您的 dictionaries 为 NSDictionary
,所有这些都是对象。使用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 行为