iOS开发Swift Cafe程序员

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 分别有一个 getset 语句块,分别用于下标的读取和赋值。

我们再来仔细看一下:

let bookShelf = BookShelf()

if let bookName = bookShelf["00001"] {

    print(bookName)

}

bookShelf["00006"] = “三体”

这个调用处,前面的 if let bookName = bookShelf["00001"] 这个实际调用的是 subscriptget 方法。

而这个调用 bookShelf["00006"] = “三体” 则是调用 subscriptset 方法。

当然,我们可以不声明下标操作的 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

上一篇 下一篇

猜你喜欢

热点阅读