#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
типом, а не SwiftArray
(но потеряйте отличное общее поведение типа SwiftArray
).
Рассмотрим этот тип, определенный в 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, ничего не изменилось. Я думаю, что речь идет о типе объекта, но не могу найти решение