我指的是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"];
答案 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"
答案 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
答案 4 :(得分:3)
如果您希望与Array
一起使用NSArray
(Swift),则可以使用简单的桥接功能。例如:
var arr1 : Array = []
arr1.bridgeToObjectiveC().count
let
的作用相同。
答案 5 :(得分:0)
来自Apple自己的文档:
收藏品的可变性
如果您创建数组,集合或字典并将其分配给a 变量,创建的集合将是可变的。这意味着 您可以在创建集合后更改(或更改)集合 添加,删除或更改集合中的项目。相反,如果 你将数组,集合或字典分配给常量,即 集合是不可变的,其大小和内容不能更改。
不可变/可变集合的其他用途取决于您希望它们是可变/不可变的原因。集合是Swift中的 value 类型,这意味着它们的内容在分配给另一个值时被复制,或者传递给另一个函数/方法。因此,您无需担心接收方法函数是否可能更改原始数组。因此,如果您的类持有可变集合,则不需要确保返回不可变集合。例如。
答案 6 :(得分:0)
Swift的数组可以静音
[let vs var, Value vs Reference Type]
不可变集合[About]-是无法更改的集合结构。这意味着您创建后无法添加,删除或修改
let + struct
(例如Array
,Set
,Dictionary
)更适合不可变
有些类(例如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)