【问题标题】:Property 'myArray' not found on object of type 'MyVC *' Swift to Obj-C passing array Error在“MyVC *”类型的对象上找不到属性“myArray” Swift 到 Obj-C 传递数组错误
【发布时间】:2020-12-10 16:24:42
【问题描述】:

这是我的 Swift 文件

@objcMembers class MyVC: NSObject {
    
    var myArray = [String]()
    
...
    

这是我的 ServiceControlVC.m Objective-C 文件

...
        MyVC *vc = [MyVC alloc];
        
        NSMutableArray *items = [NSMutableArray new];
        items = weakSelf.myModel.myModelArray;

        vc.myArray = items; // xxx this is the error point my compiler get crazy
... 

我收到此错误:
在“MyVC *”类型的对象上找不到属性“myArray”

其他属性似乎没问题,关于这个数组的对象类型或指针有一些缺失点(我的猜测)

我应该怎么做才能摆脱这个编译错误?你能告诉我为什么会发生这种铸造问题以及我如何定义我的 MyVC swift 文件属性:

var myArray = [String]() 在这种情况下是一个不好的方法?谢谢

【问题讨论】:

    标签: objective-c swift


    【解决方案1】:

    您的类必须是 NSObject 子类,您可以:

    • 使用[String] 类型,但要认识到它只是将它作为NSArray <NSString *> * 类型暴露给Objective-C,并且正在使用复制语义;或

    • 或者,将您的数组设为 NSMutableArray 类型,而不是 Swift Array(但会失去 Swift Array 类型的 generic 出色行为)。


    考虑在 Swift 中定义的这种类型:

    @objcMembers class Foo: NSObject {
        var strings: [String] = []
        var alternateStrings: NSMutableArray = []
    }
    

    然后考虑一下这个 Objective-C 行为:

    Foo *foo = [[Foo alloc] init];
    
    NSMutableArray <NSString *> *items = [NSMutableArray new];
    [items addObject:@"foo"];
    
    foo.strings = items;
    foo.alternateStrings = items;
    
    [items addObject:@"bar"];
    
    NSLog(@"myArray: %@", foo.strings);                // ["foo"]
    NSLog(@"anotherArray: %@", foo.alternateStrings);  // ["foo", "bar"]
    

    问题归结为您是否真的想将数组公开为可变的(可能不是),或者您是否可以接受 Swift [String](又名Array&lt;String&gt;)向 Objective-C 公开的复制语义. (坦率地说,即使数组在内部是可变的,我们通常还是更喜欢使用复制语义,以避免意外共享和引入的问题。)


    关于没有找到你的属性的编译器错误,可能问题是当你更改 Swift 代码时,我们需要在重新生成 {Module}-Swift.h 头文件之前进行编译。

    【讨论】:

    • 根据您的评论: NSMutableArray *myModelArray 似乎解决了这个问题..
    【解决方案2】:

    使其成为: NSObject的子类

    @objcMembers class MyVC : NSObject {
       var myArray = [String]()
    }
    

    【讨论】:

    • 它已经是 NSObject 没有任何改变。我认为这是关于对象类型但找不到解决方案
    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多