19.4 字典类
在Foundation框架中提供一种字典集合,它是由“键-值”对构成的集合。键集合不能重复,值集合没有特殊要求。键和值集合中的元素可以是任何对象,但是不能是nil
。Foundation框架字典类也分为NSDictionary
不可变字典和NSMutableDictionary
可变字典。
19.4.1 NSDictionary
类
NSDictionary
有很多方法和属性,下面总结其常用的方法和属性。
-initWithDictionary:
构造器,通过Swift的Dictionary
创建NSDictionary
对象。-initWithObjects:forKeys:
构造器,通过键集合和值集合创建NSDictionary
对象。-count
字典集合的长度。-objectForKey:
通过键获得值对象。-allKeys:
返回所有键集合。
下面看NSDictionary
数组的示例代码:
import Foundation
let keyString : NSString = "one two three four five" ①
var keys : NSArray = keyString.componentsSeparatedByString(" ") ②
let valuestring : NSString = "alpha bravo charlie delta echo" ③
var values : NSArray = valuestring.componentsSeparatedByString(" ") ④
var dict : NSDictionary = NSDictionary(objects: keys, forKeys:values) ⑤
NSLog("%@", dict.description) ⑥
var value:NSString = dict.objectForKey("three") as NSString ⑦
NSLog("three = %@", value)
var kys = dict.allKeys ⑧
for item : AnyObject in kys { ⑨
var key = item as NSString
NSLog("%@ - %@", key, dict.objectForKey(key) as NSString)
}
上述代码第①行和第③行代码是NSString
字符串,字符串由单词和空格组成。第②行和第④行代码使用空格分割字符串,返回类型是NSArray
数组。
第⑤行代码实例化NSDictionary
对象,objects
参数是值数组values
,forKeys
参数是。第⑥行代码description
属性是获得字典的内容。第⑦行代码是通过objectForKey
方法读取键对应的值,并且转换为NSString
类型。
第⑧行代码dict.allKeys
是获得所有的键集合kys
,第⑨行代码是遍历键集合kys
。
输出结果如下:
2014-07-06 20:19:07.274 PlaygroundStub_OSX[4110:303] {
five = echo;
four = delta;
one = alpha;
three = charlie;
two = bravo;
}
2014-07-06 20:19:07.281 PlaygroundStub_OSX[4110:303] three = charlie
2014-07-06 20:19:07.296 PlaygroundStub_OSX[4110:303] one - alpha
2014-07-06 20:19:07.300 PlaygroundStub_OSX[4110:303] five - echo
2014-07-06 20:19:07.305 PlaygroundStub_OSX[4110:303] three - charlie
2014-07-06 20:19:07.308 PlaygroundStub_OSX[4110:303] two - bravo
2014-07-06 20:19:07.313 PlaygroundStub_OSX[4110:303] four - delta
19.4.2 NSMutableDictionary
类
NSMutableDictionary
是NSDictionary
的子类,它有很多方法和属性,下面总结其常用的方法和属性。
-setObject:forKey:
通过键和值。-removeObjectForKey:
按照键移除值。
下面看NSDictionary
数组的示例代码:
import Foundation
var mutable : NSMutableDictionary = NSMutableDictionary() ①
// add objects
mutable.setObject("Tom", forKey: "tom@jones.com") ②
mutable.setObject("Bob", forKey: "bob@dole.com")
NSLog("%@", mutable.description)
var keys = mutable.allKeys
for item : AnyObject in keys {
var key = item as NSString
NSLog("%@ - %@", key, mutable.objectForKey(key) as NSString)
}
上述代码第①行是实例化NSMutableDictionary
,第②行代码是通过setObject
方法添加键和值。
输出结果如下:
2014-07-06 20:42:11.596 PlaygroundStub_OSX[4332:303] {
"bob@dole.com" = Bob;
"tom@jones.com" = Tom;
}
2014-07-06 20:42:11.605 PlaygroundStub_OSX[4332:303] bob@dole.com - Bob
2014-07-06 20:42:11.608 PlaygroundStub_OSX[4332:303] tom@jones.com – Tom
19.4.3 NSDictionary
与Dictionary
之间的关系
NSDictionary
与Dictionary
之间的关系如同NSArray
与Array
之间的关系,Swift在底层能够将它们自动地桥接起来,一个NSDictionary
对象桥接之后的结果是[NSObject : AnyObject]
字典(值为NSObject
类型,键为AnyObject
类型的Dictionary
字典)。
下面我们看一个使用Dictionary
和NSDictionary
的示例:
import Foundation ①
let keyString : NSString = "one two three four five"
let keys : NSArray = keyString.componentsSeparatedByString(" ")
let valueString : NSString = "alpha bravo charlie delta echo"
let values : NSArray = valueString.componentsSeparatedByString(" ")
let foundationDict : NSDictionary = NSDictionary(objects:values, forKeys:keys) ②
let swiftDict : Dictionary = foundationDict ③
printin(swiftDict.description)
let value: AnyObject? = swiftDict["three"] ④
printin("three = \(value)")
for (key, value) in swiftDict { ⑤
printin ("\(key) - \(value)")
}
代码第①行是引入Foundation
。第②行代码声明并初始化NSDictionary
字典,第③行代码是将NSDictionary
字典赋值给Dictionary
字典,这个过程也发生了类型转换,不仅是NSDictionary
到Dictionary
的转换,而且它们的内部元素也发生了转换。
第④行代码是从Dictionary
字典取three
键对应的值,它的类型是可选的AnyObject
类型,这是因为有可能取不到这个值。第⑤行代码是遍历Dictionary
字典键和值集合。