Swift 3:阻止它将[NSString]转换为[String]

时间:2016-10-13 08:41:50

标签: objective-c swift

我有这个Objective-C方法。

+ (NSArray<NSString *> *_Nullable)getValues;

在Swift中转换为[String] 并且必须传递给Swift中的另一个Objective-C方法,它看起来像Objective-C

- initWith:(NSArray<NSObject*> *_Nonnull)parameter;

所以我有这个Swift代码:

let bla = C.getValues()
MyClass(bla)

这在Objective-C中完美无缺,但在Swift中,它当然抱怨[String]不是[NSObject]的子节点,因为它自动将它从[NSString]转换为[String]。登记/> 我如何阻止斯威夫特这样做?

let bla = C.getValues() as! [NSString]

无效,因为它以无限的智慧将其首先从Objective-C转换为Swift对象,然后尝试将其转换回Objective-C对象。
在此处留言:'NSObject'不是子类型'String'。

PS:我知道我可以迭代所有内容并制作一系列转换后的副本,但必须有更好的方法:

var strings: [NSObject] = []
for string in bla! {
    strings.append(string as NSString)
}

1 个答案:

答案 0 :(得分:1)

因为getValues返回的数组可以为null,所以必须将其强制转换为[NSString]?

let bla = C.getValues() as [NSString]?

然后,由于init方法需要非null参数,因此必须强制解包bla

MyClass(bla!)

或回退到默认值:

MyClass(bla ?? [])

EXTRA:

as!用于向下投射。 C.getValues() as! [NSString]不等于(C.getValues() as [NSString]?)!