Свойство ‘myArray’ не найдено для объекта типа ‘MyVC *’ Ошибка быстрой передачи массива в Obj-C.

#objective-c #swift

#objective-c #swift

Вопрос:

Это мой файл 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
... 
 

Я получаю эту ошибку:
Свойство ‘myArray’ не найдено для объекта типа ‘MyVC *’

Другие свойства кажутся нормальными, что-то отсутствует в отношении типа объекта или указателя для этого массива (мое предположение)

Что мне делать, чтобы избавиться от этой ошибки компиляции? Можете ли вы рассказать мне, почему возникают проблемы с приведением и как я определяю свойство MyVC swift file :

var myArray = [String]() это плохой подход для этого случая? Спасибо

Ответ №1:

Ваш класс должен быть NSObject подклассом, и вы могли бы либо:

  • используйте [String] type, но признайте, что он предоставляет его только как NSArray <NSString *> * тип для Objective-C и использует семантику копирования; или
  • в качестве альтернативы, сделайте свой массив NSMutableArray типом, а не Swift Array (но потеряйте отличное общее поведение типа Swift Array ).

Рассмотрим этот тип, определенный в 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<String> ) предоставляет Objective-C. (Честно говоря, даже если массив внутренне изменяемый, мы часто предпочитаем использовать семантику копирования, в любом случае, чтобы избежать непреднамеренного совместного использования и возникающих проблем.)


Что касается вашей ошибки компилятора о том, что ваше свойство не найдено, возможно, проблема в том, что при изменении кода Swift нам нужно скомпилировать, прежде чем {Module}-Swift.h файл заголовка будет восстановлен.

Комментарии:

1. согласно вашему комментарию: NSMutableArray <NSString *> *myModelArray, похоже, решил проблему..

Ответ №2:

Сделайте его заменителем : NSObject

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

Комментарии:

1. это уже NSObject, ничего не изменилось. Я думаю, что речь идет о типе объекта, но не могу найти решение