【问题标题】:Convert NSArray to Swift Array<T>将 NSArray 转换为 Swift Array<T>
【发布时间】:2014-08-16 20:28:12
【问题描述】:

在 CoreData 中,我定义了一个 ordered 对多关系。这种关系在 Swift 中是这样定义的:

@NSManaged var types : NSMutableArray

但是,为了最好地使用 Swift,我想使用像 Type[] 这样的普通 Swift 数组。然而,CoreData 强迫我使用NS(Mutable)Array。如何将NSArray 类型转换/转换为Array&lt;Type&gt;[]

显然,混淆是由以下错误引起的:

let array = obj.types as T[] // Cannot convert expression's type 'Node[]' to type '$T2'

虽然编辑接受了这一点:

let array = obj.types as AnyObject[] as T[] // No complaint

【问题讨论】:

  • 有序关系(据我所知)由 NSOrderedSet 表示,而不是由 NSMutableArray 表示。
  • “我目前使用 obj.types.allObjects 作为 Type[],但这感觉像是一种 hack/workaround”。不,这你如何将 NSArray 转换为特定类型的 Swift 数组。
  • 哇,为什么投反对票?我有同样的问题,这似乎值得一问。

标签: core-data swift ios8


【解决方案1】:

您将不得不创建一个新的通用数组并手动填充它,如下所示:

    var result = Type[]()

    for item : AnyObject in self {
        //  Keep only objC objects compatible with OutType
        if let converted = bridgeFromObjectiveC(item, Type.self) {
            result.append(converted)
        }
    }

【讨论】:

  • 迭代一个数组以将其复制到一个新数组对我来说似乎不是很优雅。这是最简单的解决方案,即使我知道数组中的所有实例都属于同一类型?
【解决方案2】:

我目前正在使用obj.types.allObjects as Type[],但这感觉像是一种破解/解决方法。

然后修正你的感受。您所做的正是您“类型转换/将NSArray 转换为Array&lt;Type&gt;[]”的方式。

NSArray 总是以包含AnyObject(即Array&lt;AnyObject&gt;,又名AnyObject[])的形式进入Swift。将其转换为特定类型,如果您知道它包含所有一种类型,这取决于您,而您如何做这正是您应该做的。

编辑 在 Swift 2.0 和新的 iOS 9 API 中,NSArray 通常会正确输入,并且不需要强制转换。

编辑 2 在 Swift 3.0 中,虽然不常见,但类型不正确的 NSArray 将作为包含 Any 而不是 AnyObject 到达,并且仍然必须转换为特定的输入。

【讨论】:

  • 该“解决方法”对 NSArray 无效,但对 NSSet 有效。所以我仍在寻找一个好的解决方案。
  • 它对数组有效 -allObjects 是 NSSet 上的一个方法,它将所有元素作为数组返回。
  • 承认,我期待 NSArray 上有一个 allObjects;但是 NSArray 本身可以转换为数组。但是我仍然不清楚为什么需要两次演员,请参阅我更新的问题。
  • 使用 swift 2.2,仍然需要强制转换才能正确使用地图功能。
【解决方案3】:

以这种方式枚举它们:

for type in types.array {
    // Do something
}

或者只使用您正在使用的NSOrderedSetarray 属性,如下所示:

types.array

【讨论】:

    【解决方案4】:

    以下是我的一个项目中的一段工作代码,可能会有所帮助?

    if let rawArray = rawData as? NSArray,
       let castArray = rawArray as? Array< Dictionary< String, AnyObject > >
       { 
           // etc... 
       }
    

    它有效,虽然我不确定它是否会被认为是最佳的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      相关资源
      最近更新 更多