【问题标题】:Swift 3: Stop it from converting [NSString] to [String]Swift 3:阻止它将 [NSString] 转换为 [String]
【发布时间】:2016-10-13 08:41:50
【问题描述】:

我有这个 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]。

我怎样才能阻止 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)
}

【问题讨论】:

  • - initWith:(NSArray&lt;NSString*&gt;.. 不可能?
  • let bla = [C getValues] ???请用正确的语法重写问题
  • @vadian 不,它可以获取 NSObject 的所有孩子,而不仅仅是 NSString 的。
  • 你试过MyClass(bla as [NSObject]) 吗?
  • 奇怪,为我编译。 – 但是- initWith:(NSArray&lt;NSObject*&gt; *_Nullable)parameter;public init!(_ parameter: [NSObject]?) 的形式导入Swift,而不是public init!(with parameter: [NSObject]?),所以MyClass(with: bla) 根本无法编译。

标签: objective-c swift


【解决方案1】:

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

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

那么,由于init方法需要一个非空参数,所以必须强制解包bla

MyClass(bla!)

或回退到默认值:

MyClass(bla ?? [])

额外:

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

【讨论】:

  • 不错的答案,比我的解决方案更喜欢它:-)
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2011-04-02
  • 1970-01-01
  • 2019-08-27
相关资源
最近更新 更多