下标的使用

类,结构和枚举类型都可以通过定义下标来访问一组或者一个序列中的成员元素。通过下标索引就可以方便地检索和设置相应的值,而不需要其他的额外操作。

比如你可以通过someArray[index]来访问数组中的元素,或者someDictionary[key]来对字典进行索引。

你可以为一个类型定义多个下标,以及适当的下标重载用来根据传递给下标的索引来设置相应的值。下标不仅可以定义为一维的,还可以根据需要定义为多维的,多个参数的。

下标可以让你通过实例名后加中括号内一个或多个数值的形式检索一个元素。语法和方法语法和属性语法类似,通过使用subscript关键定义,一个或多个输入参数以及一个返回值。

不同于实例方法的是,下标可以是可读写的或者只读的。这种行为通过一个getter和setter语句联通,就像是计算属性一样。

//: Playground - noun: a place where people can play

import UIKit

/*
下标:
1.所有的swift类型(枚举, 类和结构体)都支持定义下标
2.同一个类型可以定义多个下标
3.通过下标的形参列表或者返回值类型来区分不同的下标
4.同一类型中定义多个不同的下标被称为下标重载
*/

class Person
{
    var x:Int?
    var y:Int?
    var width:Int?
    var height:Int?
    
    // 通过下标进行访问时会调用
    // 形参列表, 与参数的形参列表的用法基本相同, 但是不支持指定外部参数和默认值
    // 下标的返回值类型可以是任何有效的类型
    subscript (index: Int) -> Int {
        get{
            switch index {
            case 0:
                return self.x!
            case 1:
                return self.y!
            case 2:
                return self.width!
            case 3:
                return self.height!
            default:
                return 0
            }
        }
        
        // 通过下标进行设置时会调用
        set(newValue){
            switch index {
            case 0:
                self.x = newValue
            case 1:
                self.y = newValue
            case 2:
                self.width = newValue
            case 3:
                self.height = newValue
            default:
                break
            }
        }
    }
    
    subscript(stringNameKey: String) -> Int? {
        get {
            switch stringNameKey {
            case "x":
                return self.x!
            case "y":
                return self.y!
            case "y":
                return self.width!
            case "y":
                return self.height!
            default:
                return nil
            }
        }
    }
}

var p = Person()
p.x = 1
p.y = 2
p.width = 3
p.height = 4
// 通过下标访问属性
p[0]
// 通过下标修改属性
p[1] = 11111
p.y
p["x"]
p["y"]

  

posted @ 2016-02-04 18:03  Rinpe  阅读(394)  评论(0编辑  收藏  举报