转载

Swift Tips - 在 Swift 中自定义下标访问

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 方法中,提供 getset 两个方法,分别对应下标的读取和写入方法,我们前面那个 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

正文到此结束
Loading...