Swift中的不可变/可变集合

时间:2014-06-07 10:11:11

标签: ios objective-c swift immutability mutable

我指的是Apple的Swift编程指南,用于理解用Swift语言创建Mutable / immutable对象(Array,Dictionary,Sets,Data)。但我无法理解如何在Swift中创建不可变的集合。

我想在Objective-C

中看到Swift中的等价物

不可变数组

NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];

可变阵列

NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];

不可变词典

NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];

可变词典

NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];

8 个答案:

答案 0 :(得分:103)

阵列

创建不可变数组

第一种方式:

let array = NSArray(array: ["First","Second","Third"])

第二种方式:

let array = ["First","Second","Third"]

创建可变数组

var array = ["First","Second","Third"]

将对象追加到数组

array.append("Forth")


字典

创建不可变字典

let dictionary = ["Item 1": "description", "Item 2": "description"]

创建可变字典

var dictionary = ["Item 1": "description", "Item 2": "description"]

将新对添加到词典

dictionary["Item 3"] = "description"

More information on Apple Developer

答案 1 :(得分:30)

Swift没有替换NSArray或Objective-C中的其他集合类。

有数组和字典类,但应注意这些是" value"类型,与NSArray和NSDictionary相比,它们是"对象"类型。

差异很微妙,但对于避免边缘案例错误非常重要。

在swift中,你创造了一个不可变的"数组:

let hello = ["a", "b", "c"]

"变异"数组:

var hello = ["a", "b", "c"]

可以像NSMutableArray一样修改可变数组:

var myArray = ["a", "b", "c"]

myArray.append("d") // ["a", "b", "c", "d"]

但是,您无法将可变数组传递给函数:

var myArray = ["a", "b", "c"]

func addToArray(myArray: [String]) {
  myArray.append("d") // compile error
}

但上面的代码适用于NSMutableArray:

var myArray = ["a", "b", "c"] as NSMutableArray

func addToArray(myArray: NSMutableArray) {
  myArray.addObject("d")
}

addToArray(myArray)

myArray // ["a", "b", "c", "d"]

您可以使用NSMutableArray方法参数来实现inout的行为:

var myArray = ["a", "b", "c"]

func addToArray(inout myArray: [String]) {
  myArray.append("d")
}

addToArray(&myArray)

myArray // ["a", "b", "c", "d"]

重写此答案2015-08-10以反映当前的Swift行为。

答案 2 :(得分:6)

Swift中只有一个Array和一个Dictionary类型。可变性取决于你如何构建它:

var mutableArray = [1,2,3]
let immutableArray = [1,2,3]

即。如果你创建一个赋值变量它是可变的,而如果你创建一个赋值给常量它不是。

警告:不可变数组并非完全不可变!你仍然可以改变他们的内容,而不是他们的整体长度!

答案 3 :(得分:5)

只需用

声明你的(任意)对象或变量
'let' key word -> for "constan/Immutable" array, dictionary, variable, object..etc.

'var' key word -> for "Mutable" array, dictionary, variable, object..etc. 

更深入的信息

  

“使用制作常量,使用 var 制作变量。在编译时不需要知道常量的值,但是必须为其分配一次值。这意味着您可以使用常量来命名您确定一次但在许多地方使用的值。"

var myVariable = 42
myVariable = 50
let myConstant = 42

Read “The Swift Programming Language.”

答案 4 :(得分:3)

如果您希望与Array一起使用NSArray(Swift),则可以使用简单的桥接功能。例如:

var arr1 : Array = []

arr1.bridgeToObjectiveC().count

let的作用相同。

答案 5 :(得分:0)

来自Apple自己的文档:

  

收藏品的可变性

     

如果您创建数组,集合或字典并将其分配给a   变量,创建的集合将是可变的。这意味着   您可以在创建集合后更改(或更改)集合   添加,删除或更改集合中的项目。相反,如果   你将数组,集合或字典分配给常量,即   集合是不可变的,其大小和内容不能更改。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105

不可变/可变集合的其他用途取决于您希望它们是可变/不可变的原因。集合是Swift中的 value 类型,这意味着它们的内容在分配给另一个值时被复制,或者传递给另一个函数/方法。因此,您无需担心接收方法函数是否可能更改原始数组。因此,如果您的类持有可变集合,则不需要确保返回不可变集合。例如。

答案 6 :(得分:0)

[Unmodifiable and Immutable]

Swift的数组可以静音

[let vs var, Value vs Reference Type]

不可变集合[About]-是无法更改的集合结构。这意味着您创建后无法添加,删除或修改

let + struct(例如ArraySetDictionary)更适合不可变

有些类(例如NSArray)不提供更改内部状态的接口

但是

class A {
    var value = "a"
}

func testMutability() {
    //given
    let a = A()
    
    let immutableArr1 = NSArray(array: [a])
    let immutableArr2 = [a]
    
    //when
    a.value = "aa"
    
    //then
    XCTAssertEqual("aa", (immutableArr1[0] as! A).value)
    XCTAssertEqual("aa", immutableArr2[0].value)
}   

宁愿是unmodifiable数组

答案 7 :(得分:-1)

没有内置演员阵容。但是你可以使用NSMutableDictionary的带字典的初始化器:

var foundationDictionary = NSMutableDictionary(dictionary: dictionary)