我有这个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)
}
答案 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]?)!
。