美文网首页
Swift语法 -- [21 - 字面量协议]

Swift语法 -- [21 - 字面量协议]

作者: happy神悦 | 来源:发表于2020-11-02 09:14 被阅读0次

    常见字面量的默认类型
    public typealias IntegerLiteralType = Int //整数类型默认字面量是Int
    public typealias FloatLiteralType = Double //浮点数的默认字面量是Double
    public typealias BooleanLiteralType = Bool
    public typealias StringLiteralType = String

    Swift自带的绝大部分类型, 都支持直接通过字面量进行初始化,例如 Bool、Int、Float、Double、String、Array、Dictionary、Set、Optional等

    1. 字面量(Literal)

    // 下面代码中的10、false、"Jack"就是字面量
    var age = 10
    var isRed = false
    var name = "Jack"
    
    //可以通过typelias修饰字面量的默认类型
    typealias FloatLiteralType = Float
    typealias IntegerLiteralType = UInt8
    var age = 10 // UInt8
    var height = 1.68 // Float
    

    2. 字面量协议

    Swift自带类型之所以能够通过字面量初始化, 是因为他们遵守了对应的协议

    • Bool : ExpressibleByBooleanLiteral
    • Int : ExpressibleByIntegerLiteral
    • Float、Double : ExpressibleByIntegerLiteral、ExpressibleByFloatLiteral
    • Dictionary : ExpressibleByDictionaryLiteral
    • String : ExpressibleByStringLiteral
    • Array、Set : ExpressibleByArrayLiteral
    • Optional : ExpressibleByNilLiteral
    var b: Bool = false // ExpressibleByBooleanLiteral
    var i: Int = 10 // ExpressibleByIntegerLiteral
    var f0: Float = 10 // ExpressibleByIntegerLiteral
    var f1: Float = 10.0 // ExpressibleByFloatLiteral
    var d0: Double = 10 // ExpressibleByIntegerLiteral
    var d1: Double = 10.0 // ExpressibleByFloatLiteral
    var s: String = "jack" // ExpressibleByStringLiteral
    var arr: Array = [1, 2, 3] // ExpressibleByArrayLiteral
    var set: Set = [1, 2, 3] // ExpressibleByArrayLiteral
    var dict: Dictionary = ["Jack": 60] // ExpressibleByDictionaryLiteral
    var o: Optional<Int> = nil  // ExpressibleByNilLiteral
    

    3. 字面量协议应用(一)

    /* 想让某种类型想通过某种字面量来初始化的话, 那么就让某种类型遵守某种字面量协议 */
    // 让Int类型遵守ExpressibleByBooleanLiteral协议, 就可以通过Bool类型字面量初始化Int类型
    extension Int : ExpressibleByBooleanLiteral {
      public init(booleanLiteral value: Bool) { self = value ? 1 : 0 }
    }
    var num: Int = true
    print(num) // 1
    
    /* 有点类似于C++中的转换构造函数 */
    /// 想通过一些字面量,直接初始化你自定义的一些类型, 那么遵守字面量协议就可以了
    class Student : ExpressibleByIntegerLiteral, ExpressibleByFloatLiteral, ExpressibleByStringLiteral, CustomStringConvertible {
        var name: String = ""
      var score: Double = 0
      required init(floatLiteral value: Double) { self.score = value }
      required init(integerLiteral value: Int) { self.score = Double(value) }
      
      required init(StringLiteral value: String) { self.name = value }//普通字符
      required init(unicodeScalarLiteral value: String) { self.name = value }//特殊符号
      required init(extendedGraphemeClusterLiteral value: String) { self.name = value }//特殊符号
      
      var description: String { "name=\(name),score=\(score)" }
    }
    var stu: Student = 90
    print(stu) // name=,score=90.0
    stu = 98.5
    print(stu) // name=,scor=98.5
    stu = "Jack"
    print(stu) // name=Jack,scor=0.0
    

    4. 字面量协议应用(二)

    struct Point {
      var x = 0.0, y = 0.0
    }
    extension Point : ExpressibleByArrayLiteral, ExpressibleByDictionaryLiteral {
      init(arrayLiteral elements: Double...) {
        guard elements.count > 0 else { return }
        self.x = elements[0]
        guard elements.count > 1 else { return }
        self.y = elements[1]
      }
      init(dictionaryLiteral elements: (String, Double)...) {
        for (k, v) in elements {
          if k == "x" { self.x = v }
          else if k == "y" { self.y = v }
        }
      }
    }
    var p: Point = [10.5, 20.5]
    print(p) // Point(x: 10.5, y: 20.5)
    p = ["x" : 11, "y" : 22]
    print(p) // Point(x: 11.0, y: 22.0)
    

    相关文章

      网友评论

          本文标题:Swift语法 -- [21 - 字面量协议]

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