使用Obj-C进行初始化时,Mutable Swift数组变为NSArray

时间:2015-09-05 01:04:39

标签: ios objective-c arrays swift swift2

我在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

有什么想法吗?

2 个答案:

答案 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。