objective-c - swift 3 : Stop it from converting [NSString] to [String]

标签 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]。
< 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/

相关文章:

ios - 使用模态视图 Controller 和 UIVisualEffectView

ios - 如何从自定义 UICollectionViewCell NIB 呈现 popoverPresentationController

swift - AudioKit:在 Swift 框架中嵌入 AudioKit

swift - 如何在容器外授予文件系统访问权限?

swift - Xcode 11 Beta 4 归档快速错误

ios - 在AFJSONRequestOperation中设置JSONReadingOptions

ios - 删除核心数据对象和表格单元

iphone - 当上下文保存在核心数据中时,如何更改实体?

swift - 如何摆脱 Swift 闭包中的 $0 ?

ios - NSUserDefaults 在使用应用程序时保存并重新加载,但在应用程序重新启动时重置