我有这个 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]。
< br/>
我怎样才能阻止 Swift 这样做?
let bla = C.getValues() as! [NSString]
不起作用,因为它以无限的智慧首先将它从 Objective-C 转换为 Swift 对象,然后尝试将其转换回 Objective-C 对象。
此处消息:'NSObject' 不是子类型的“字符串”。
PS:我知道我可以遍历所有内容并制作一组转换后的副本,但必须有比这更好的方法:
var strings: [NSObject] = []
for string in bla! {
strings.append(string as NSString)
}
最佳答案
因为 getValues
返回数组可以为 null,所以你必须将它转换为 [NSString]?
:
let bla = C.getValues() as [NSString]?
然后,由于init方法需要一个非空参数,你必须强制解包bla
:
MyClass(bla!)
或退回到默认值:
MyClass(bla ?? [])
额外:
as!
用于向下转换。 C.getValues() 作为! [NSString]
不等于 (C.getValues() as [NSString]?)!
。
关于objective-c - swift 3 : Stop it from converting [NSString] to [String],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40016180/