【问题标题】:Annotate NSArray<NSNumber *> * in Objective-C so that it is bridged to Array<Int>在 Objective-C 中注释 NSArray<NSNumber *> * 使其桥接到 Array<Int>
【发布时间】:2018-04-10 09:04:42
【问题描述】:

有没有办法注释NSArrayNSNumber

@property (nonatomic) NSArray<NSNumber *> *myProperty

在 Objective-C 中,以便在 Swift 中导入为

var myProperty: [Int] 而不是var myProperty: [NSNumber]

我知道NS_SWIFT_NAME,但这不允许更改类型

【问题讨论】:

  • 你能解释清楚一点吗?你需要一个Int 数组或NSNumber 数组吗?或者可能是目标 c 中的 Int 数组?
  • Swift 中的 Int 数组来自 Objective-C 中的 NSArray&lt;NSNumber *&gt; *
  • 在问了这个问题后,我又研究了一点。我不认为这是可能的。如果您查看UIGestureRecognizerallowedTouchTypes 属性。那也是一个NSArray&lt;NSNumber *&gt; * 返回类型,并在Swift 中作为[NSNumber] 导入。
  • @Trenskow 您可以从您的数字数组[NSNumber] 中获取任何元素并访问其intValue 属性,该属性将返回Int。你也可以映射所有元素numbers.map{$0.intValue}会返回一个Int数组[Int]
  • @Trenskow 如果你正在使用 NSArray,你需要从 Any 转换为 NSNumber numbers.flatMap{($0 as? NSNumber)?.intValue}。但是你应该使用 Swift 原生数组类型

标签: objective-c swift types bridging


【解决方案1】:

很遗憾,从 Objective-C 导入符号时,您无法更改静态类型。

但是你可以在没有任何类型转换的情况下分配一个 Swift Int 数组(假设 foo 是 ObjC 类的一个实例)。但是类型不会改变。

foo.myProperty = [1, 2, 3, 4, 5]
print(type(of: foo.myProperty)) // Optional<Array<NSNumber>>

另一方面,要获得独特的 [Int] 类型,您必须强制转换类型

let mySwiftProperty = foo.myProperty as! [Int]
print(type(of: mySwiftProperty)) // Array<Int>

【讨论】:

  • 我接受这个作为正确答案。在最初的问题之后,我做了一些研究,甚至 UIKit 也这样做,所以我想这是不可能的。我只是不想让我的用户有责任将其转换为正确的类型。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2020-02-07
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多