SwiftCafe 快报 - 自定义下标访问
2015-10-21 本文已影响107人
SwiftCafe
Subscript
数组使我们日常开发中经常会接触到的东西,简单来说,它就是一个变量,里面存放的是一组内容,然后我们通过下标的方式获取或设置其中的某一项内容。
比如在 Swift
中,我们可以这样使用数组:
let array = [1,2,3,4]
array[2] = 4
print("\(array[3])")
这样的下标访问大家并不陌生。在 Swift 中,我们除了可以访问数组的下标,还可以对我们自己的类声明下标访问:
class BookShelf {
var bookList = [
"00001":"Swift Programming Language",
"00002":"SwiftCafe 快报",
"00003":"SwiftCafe 深阅读"
]
subscript(barcode : String) -> String? {
get {
return bookList[barcode]
}
set(newValue) {
bookList[barcode] = newValue
}
}
}
let bookShelf = BookShelf()
if let bookName = bookShelf["00001"] {
print(bookName)
}
bookShelf["00006"] = “三体”
我们这里定义了一个类 BookShelf
, 大家注意看一个关键字 - subscript
。这个关键字用于定义下标访问,我们可以看到,这个下标访问的定义,接受一个 String
类型的参数,我们可以把它想象成图书的二维码,然后我们这个方法根据图书的二维码查找到书籍的名称。
然后,这个 subscript
分别有一个 get
和 set
语句块,分别用于下标的读取和赋值。
我们再来仔细看一下:
let bookShelf = BookShelf()
if let bookName = bookShelf["00001"] {
print(bookName)
}
bookShelf["00006"] = “三体”
这个调用处,前面的 if let bookName = bookShelf["00001"]
这个实际调用的是 subscript
的 get
方法。
而这个调用 bookShelf["00006"] = “三体”
则是调用 subscript
的 set
方法。
当然,我们可以不声明下标操作的 set
方法,这样下标操作就变成只读的了。
假如我们将之前的 subscript
定义为这样:
subscript(barcode : String) -> String? {
return bookList[barcode]
}
这时,如果我们再对 bookShelf
进行下标赋值就会报错了:
bookShelf["00006"] = “三体”
subscript
方法除了接受的参数类型和个数都不受限制,我们甚至可以使用多个参数作为下标:
class BookShelf {
var bookList = [
"Top" : [
"00001":"Swift Programming Language",
"00002":"SwiftCafe 快报",
"00003":"SwiftCafe 深阅读"
],
"Bottom" : [
]
]
subscript(location:String,barcode : String) -> String? {
guard let shelf:[String:String] = bookList[location] as? [String:String]
else { return nil }
return shelf[barcode]
}
}
我们这次修改后的 subscript
方法,接受两个参数。我们可以这样调用它:
let bookShelf = BookShelf()
if let bookName = bookShelf["Top","00001"] {
print(bookName)
}
更多精彩内容可关注微信公众号:
swift-cafe