Untitled Document.md
在 Swift 中,我们可以使用下标轻松的访问数组中的元素。比如这样:
var numbers:Array = [1,2,3,4,5] println(numbers[2]) println(numbers[4])
还可以以字典的模式来进行下标访问,比如这样:
var props:Dictionary<String,String> = ["name":"Swift","speed":"fast","level":"robust"] println(NSString(format:"%@ is a %@ and %@ language",props["name"]!,props["speed"]!,props["level"]!))
相信对编程稍微有些了解的同学,对这个特性都不会感到奇怪。所以到这里大家可能会有些疑问了,这有什么奇怪的呢,任何一门编程语言几乎都有对下标访问的支持。
没错,如果单单是下标访问的支持,确实并没有什么可说的。而 Swift 确更进了一步,问我们提供了更多的东西。
这就是, Swift 中不但提供了对数组等内置集合进行下标访问,更支持了让我们对自己的类自定义下标访问方法的特性。也就是说任何我们自己的集合类,比如数据库实体类,都可以用我们自己定义的方法来实现下标访问操作符。 <!-- more --> 下面我们就来看一个例子(你可以打开 Xcode 的 Playground和我一起做哦):
import Foundation class Apps{ var names:Array<String> = ["Facebook","Twitter","iBooks","GoodReader"]; subscript(index: Int) -> String { get{ var unit = "th" if(index == 1){ unit = "st" }else if(index == 2){ unit = "nd" } return NSString(format:"The %i%@ app is %@",index,unit,self.names[index]) } } } var apps:Apps = Apps() println(apps[0]) // The 0th app is Facebook println(apps[1]) // The 1st app is Twitter println(apps[2]) // The 2nd app is iBooks println(apps[3]) // The 3th app is GoodReader
这个类 Apps
里面,包含了一个数组 names
,我们实现了直接通过这个类进行下标访问。通过这行代码:
subscript(index: Int) -> String {
关键字 subscript
是用来定义下标访问方法的。它可以接受人意数量和类型的参数,这也就意味着,我们可以用任何类型的值作为它的下标。紧接着我们实力化了这个类的对象,然后通过下标的方式输出了它的值:
var apps:Apps = Apps() println(apps[0]) // The 0th app is Facebook
是不是非常容易就实现了自定义的下标访问了。 在 Swift 中,定义下标的基本语法是这样:
subscript(index: Int) -> String { get{ ... } set{ ... } }
我们可以在 subscript
方法中,提供 get
和 set
两个方法,分别对应下标的读取和写入方法,我们前面那个 Apps
类中只实现了 get
方法。这也就是意味着我们的 Apps
类只可以进行下标的只读访问,如果下标的设置操作就会报错了:
apps[0] = "Xcode" //报错
要实现对下标的写入操作,我们就要实现 set
方法了:
set { names[index] = newValue }
这里的 newValue
代表传递进来的新值,我们在这里把这个新值赋给这个类内部的 names 数组。
接下来,我们再这样调用这个类:
var apps:Apps = Apps() println(apps[2]) // The 2nd app is iBooks apps[2] = "iWorks" // iWorks println(apps[2]) // The 2nd app is iWorks
这次我们能够正常的通过下标写入这个对象的值了。这样我们对这个类的自定义下标就完成了。
下面是这个类的完整代码:
import Foundation class Apps{ var names:Array<String> = ["Facebook","Twitter","iBooks","GoodReader"]; subscript(index: Int) -> String { get{ var unit = "th" if(index == 1){ unit = "st" }else if(index == 2){ unit = "nd" } return NSString(format:"The %i%@ app is %@",index,unit,self.names[index]) } set { names[index] = newValue } } }
这样,我们的自定义下标就完成了。关于自定义下标的更多内容,大家还可以参看苹果官方的资料:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html
更多文章请访问: www.theswiftworld.com