将Enum中的静态Swift数组转换为NSArray时出错

时间:2014-10-22 14:11:43

标签: arrays swift enums nsarray

据我了解,如有必要,Swift中的Array会自动投放到NSArray

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html 在该帐户上说

  

“当您从NSArray对象桥接到Swift数组时,生成的数组的类型为AnyObject []。如果对象是Any-Object兼容的,如果它是Objective-C或Swift类的实例,或者该对象可以桥接到一个对象。您可以将任何NSArray对象桥接到Swift数组,因为所有Objective-C对象都是AnyObject兼容的。因为所有NSArray对象都可以桥接到Swift数组,所以Swift编译器在导入Objective-C API时用AnyObject []替换NSArray类。“

Auszug aus:Apple Inc.“将Swift与Cocoa和Objective-C结合使用。”iBooks。 https://itunes.apple.com/de/book/using-swift-cocoa-objective/id888894773?mt=11

在我的Playground中,以下内容失败

  

[位置]不能转换为'NSArray'

import Foundation

enum Position : String {
    case TopLeft = "Top Left", TopCenter = "Top Center", TopRight = "Top Right", BottomLeft = "Bottom Left", BottomCenter = "Bottom Center", BottomRight = "Bottom Right"
    // pattern to iterate enums by http://www.swift-studies.com/blog/2014/6/10/enumerating-enums-in-swift
    static let allValues : [Position] = [TopLeft, TopCenter, TopRight, BottomLeft, BottomCenter, BottomRight]
}

let a : NSArray = Position.allValues

正如我所理解的那样,Position.allValues是一个有效的数组,虽然是静态的。我想念一些东西还是有人可以帮忙?感谢。

2 个答案:

答案 0 :(得分:4)

问题是allValues是位置的数组。但是位置是一个枚举,而Swift枚举不能跨过Objective-C的桥梁。

所以,是的,[Int][String]将神奇地越过桥梁成为NSArray,而不是[Position] - 正是错误信息告诉你的。

答案 1 :(得分:2)

作为@ matt的答案的补充,因为我注意到你在枚举中使用原始值,你可以将枚举的数组转换为字符串数组,只需获取每个案例的原始值,然后使用map方法:

let a : NSArray = Position.allValues.map { $0.rawValue }