• Swift Tips


    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

  • 相关阅读:
    【BZOJ1835】[ZJOI2010]base 基站选址 线段树+DP
    【BZOJ1786】[Ahoi2008]Pair 配对 DP
    【BZOJ3956】Count 主席树+单调栈
    【BZOJ4605】崂山白花蛇草水 权值线段树+kd-tree
    【BZOJ2597】[Wc2007]剪刀石头布 最小费用流
    前端学习笔记之CSS属性设置
    前端学习笔记之HTML body内常用标签
    前端学习笔记之CSS介绍
    前端学习笔记之CSS选择器
    博客园美化技巧汇总
  • 原文地址:https://www.cnblogs.com/theswiftworld/p/4232276.html
Copyright © 2020-2023  润新知