我在Swift(2.0)中创建我的基础模型,然后在Objective-C中控制视图。我还是Swift的新手,所以我希望我只是忽略了一些简单的事情,但问题出在这里:
我在Swift中创建了一个可变数组,但是当我在程序的Objective-c部分初始化数组时,它变为NSArray
,更具体地说它变为:Swift._SwiftDeferredNSArray
为什么在初始化时它变得不可变?这是我的Swift代码:
import Foundation
@objc public class Model : NSObject {
var books:[Book]
override init(){
self.books = [Book]()
}
}
这是我的Obj-c代码;
Model *bookCollection = [[Model alloc]init];
我无法将对象添加到我的bookCollection.books
数组中(因为它已成为NSArray
),当我设置断点并将其设为po时,我可以看到它是{{1 }}。 bookCollection.books应该是Swift._SwiftDeferredNSArray
。
有什么想法吗?
答案 0 :(得分:3)
bookCollection.books应该是一个NSMutableArray。
不,不是。 Var
并不意味着桥接的Objective-C对象是可变的:这意味着可以将属性赋值给。
Swift数组类型是一个结构,而不是一个类。这具有重要的桥接意义。如果不将{1}}值作为inout
传递,则无法共享引用本身,即使这样也无法存储引用。如果它被桥接为NSMutableArray
,则可能有不可检测的变异引用,而Swift不允许这样做。
但是,您应该可以从Objective-C代码为您的属性分配新的NSArray
。例如,这应该有效:
bookCollection.books = [bookCollection.books arrayByAddingObject:myNewBook];
显然,您的另一个选择是从Swift方面将books
声明为NSMutableArray
。
答案 1 :(得分:3)
在swift中,mutable和immutable数组之间的区别是;
var books:[Book] // is a mutable array
let books:[Book] = [book1, book2]; // is immutable array due to let
但我不认为,在与ObjC建立联系时遵循同样的规则。
只是为了修复,你可能会专门有mutableArray。
import Foundation
@objc public class Model : NSObject {
var books:NSMutableArray = NSMutableArray();
override init(){
super.init();
// other code
}
}
从数组中检索时,您需要将值解析为Book Class。