【问题标题】:Cannot access a bridged NSArray from Swift无法从 Swift 访问桥接的 NSArray
【发布时间】:2016-01-17 10:05:08
【问题描述】:

为什么我不能使用 Swift 的 Objective-C NSArray?根据文档:Working with Cocoa Data Types Swift 应该将NSArray<Type*>* 桥接到[Type]

我在 Objective-C 中定义了这个对象:

@interface Data : NSObject
@property (strong, nonatomic, readonly) NSArray<NSNumber*>* arrayOfNumbers;
@end

Objective-C中定义的这个方法:

@protocol DataReceiver
- (void)onDataReceived:(Data*)data;
@end

这是在 Swift 中定义的:

class MyDataReceiver : DataReceiver {
    func onDataReceived(data: Data!) {
        test(data.arrayOfNumbers[0]);
    }

    func test(num: Float) {
        NSLog("%f", num);
    }
}

我收到错误消息:'Type [NSNumber]!没有下标成员'。但是这个:

NSLog("%f", arrayOfNumbers[0]);

编译得很好....

这里发生了什么?

【问题讨论】:

  • 这行得通吗? NSLog("%@", data.arrayOfNumbers[0])
  • @kennytm 奇怪,它确实使用这种方法编译,但是当我立即尝试将它传递给这样的函数时不起作用:func test(num: Float) { NSLog("%f", num); } test(data.arrayOfNumbers[0])(给出相同的错误)
  • 你真的需要Data作为可选吗?
  • @vadian 一点也不,这正是 Swift 生成的。
  • 请注意NSLog("%f", arrayOfNumbers[0]) 编译,因为 (Swift) 编译器不检查变量参数列表的类型。但是,它不会产生正确的输出,因为对象 pointer 被解释为浮点数。

标签: objective-c swift cocoa cocoa-touch


【解决方案1】:

错误消息没有意义,但它是由于您试图将NSNumber 传递给接受Float 的方法造成的。这意味着编译器正在尝试找到一个返回 Float 的下标方法,但显然它找不到它。

func test(num: NSNumber) {
    NSLog("%@", num);
}

应该解决问题。 Objective-C 到 Swift 的桥接按预期工作。

【讨论】:

  • 这是有道理的,我想错误信息对我来说有点不清楚。谢谢!
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多