美文网首页
DAY7:Basic Operators & Prot

DAY7:Basic Operators & Prot

作者: SheBang_ | 来源:发表于2015-12-08 23:30 被阅读22次

    空运算符(nil coalescing operator)(??)

    ------简单的说就是a有值取a,没有值取默认值b
    空运算符(a??b)将可选型a进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b。这个运算符号有两个条件:

    1. 表达式a必须时optional类型

    2. 默认值b的类型必须要和a存储的类型要保持一致
      空运算符是对以下代码的简短表达方法

       a != nil ? a! : b
      

    意思是当a不为空的时候,取a!强制对a进行解封,当a为空的时候,取值b

    区间运算符

    ------就是从a到b这个闭区间(包括a和b)上所有值
    闭区间运算符(a...b)定义了一个从a到b(包括a和b的所有值的区间),b必须大于a。

     var index:Int
     for index in 1...5{
          println("\(index)*5 = \(index*5)")
        }
        /**
        1*5 = 5
        2*5 = 10
        3*5 = 15
        4*5 = 20
        5*5 = 25
        **/
    

    半开区间运算符号

    半开区间运算符号(a..<b)定义的是从a到b但是不包括b的区间,只包含首值,不包含末尾的值

        let names = ["Anna","Alex","Brian","Jack"]
        let count = names.count
        for i in 0..<count {
            println("第\(i+1)个人叫\(names[i])")
        }
        //
        第1个人叫Anna
        第2个人叫Alex
        第3个人叫Brian
        第4个人叫Jack
    

    数组是从0开始计数的,用半区间的话,数组.count的时候去的是数组的长度,但是循环是从0开始的,用闭区间的话,就会从0到4,是五个数,但是用半区间的话就是从0到3,正好是4个数对应数组的长度。

    protocol

    暂时我的感觉protocol在swift中的作用相当于java中的接口,规定了有哪些属性和方法,但是不说必要的实现
    下面是一条样例:
    我们规定了一个协议Fullname,这个协议中有一个可读的属性fullname,我们的starship遵守Fullname协议,所以他必须要有fullname属性,下面实例化Starship时候,传入name和prefix。
    先实例化,实例化的时候运行了初始化的函数,赋值了name和prefix属性。fullname根据我们赋值的name和prefix来定。n123的fullname为“ yaqi”,n1234的fullname为“jiang yaqi”

      protocol FullName {
        var fullname:String { get }
    }//表示该属性是可读的
    
    class Starship:FullName {
        var prefix:String?
        var name:String
        init(name:String,prefix:String? = nil){
        self.name = name
        self.prefix = prefix
    }
    var fullname:String{
        return (prefix != nil ? prefix! + " " : " ")+name
    }//如果prefix不为空那个fullname取值“prefix空格+name”,如果prefix没有值取值“空格+name”
    }
    var n123 = Starship(name:"yaqi")
    n123.fullname
    var n1234 = Starship(name:"yaqi",prefix:"jiang")
    n1234.fullname
    

    下面是一个遵守协议的类的例子:

    protocol RandomNumberGenerator{
        func random() ->Double
    }//协议规定了方法,当类要遵守协议的时候就要包涵该方法。只是规定了方法的方法名字,还有返回的数据类型,具体实现,没有规定
    
    class LinerCongruentialGenerator:RandomNumberGenerator {
      var lastRandom = 42.0
      let m = 139968.0
      let a = 3877.0
      let c = 29573.0
      func random() ->Double{
          lastRandom = ((lastRandom * a + c)%m)
          return lastRandom / m
      }
    }//该实现类遵守了该协议,包含了协议中规定的方法。
    let generator = LinerCongruentialGenerator()//实例化一个实现类
    print("Here's a random number:\(generator.random())")//调用类中的函数random()
    print("And another one:\(generator.random())")

    相关文章

      网友评论

          本文标题:DAY7:Basic Operators & Prot

          本文链接:https://www.haomeiwen.com/subject/pbiehttx.html