最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift之運算符重載示例詳解

 更新時間:2023年07月07日 10:49:16   作者:大劉  
這篇文章主要為大家介紹了Swift之運算符重載示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

在C++中, 運算符是可以重載的, Swift也是支持的

注:=和三目運算符a ? b : c不可重載

重載雙目運算符

class Vector {
    var x: Double = 0.0
    var y: Double = 0.0
    var z: Double = 0.0
    init(x: Double, y: Double, z: Double) {
        self.x = x
        self.y = y
        self.z = z
    }
    convenience init() {
        self.init(x: 0, y: 0, z: 0) 
    }
    /// Operator '+' declared in type 'Vector' must be 'static'
    /// + 是雙目運算符,兩個參數(shù)
    static func +(v1: Vector, v2: Vector) -> Vector {
        let vector: Vector = Vector()
        vector.x = v1.x + v2.x
        vector.y = v1.y + v2.y
        vector.z = v1.z + v2.z
        return vector
    }
}

單目運算符

類和結(jié)構(gòu)體也可以實現(xiàn)單目運算符,單目運算符只運算一個值。

運算符出現(xiàn)在值之前為前綴運算符(prefix, 如 -a),出現(xiàn)在值之后為后綴運算符(postfix, 如a!)。

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
    static prefix func +(coordinate: Coordinate) -> Coordinate {
        return Coordinate(x: +coordinate.x, y: +coordinate.y)
    }
    static prefix func -(coordinate: Coordinate) -> Coordinate {
        return Coordinate(x: -coordinate.x, y: -coordinate.y)
    }
}
func test() {
    let p1 = Coordinate(x: 1.0, y: 1.0)
    let p2 = Coordinate(x: 2.0, y: 2.0)
    print(-p1) // Coordinate(x: -1.0, y: -1.0)
    print(+p2) // Coordinate(x: 2.0, y: 2.0)
}

復(fù)合賦值運算符

復(fù)合賦值運算符是賦值運算符(=)和其他運算符進行結(jié)合, 如 +=、-=

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
    // 如果放在全局函數(shù)里, 不需要加static, 否則, static不可省略
    static func +=(left: inout Coordinate, right: Coordinate) {
        left = Coordinate(x: left.x + right.x, y: left.y + right.y)
    }
    static func -=(c1: inout Coordinate, c2: Coordinate) {
        left = Coordinate(x: left.x - right.x , y: left.y - right.y)
    }
}
func test() {
    var p1 = Coordinate(x: 1.0, y: 1.0)
    let p2 = Coordinate(x: 2.0, y: 2.0)
    p1 += p2
    print(p1) // Coordinate(x: 3.0, y: 3.0)
}

等價運算符 ==

自定義類和結(jié)構(gòu)體沒有對等價運算符進行默認的實現(xiàn)。等價運算符一般被稱為相等運算符==和不等運算符 !=

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
    static func ==(c1: Coordinate, c2: Coordinate) -> Bool {
        return c1.x == c2.x && c1.y == c2.y
    }
    static func !=(left: Coordinate, right: Coordinate) -> Bool {
        return left.x != right.x || left.y != right.y
    }
}
func test() {
    let p1 = Coordinate(x: 1.0, y: 1.0)
    var p2 = Coordinate(x: 2.0, y: 2.0)
    print(p1 == p2) // false
    p2.x -= 1
    p2.y -= 1
    print(p1 == p2) // true
}

自定義運算符

可以自定義前置運算符prefix、后置運算符postfix、中置運算符infix, 約束條件:

  • 只能使用如下字符:
    - + * / = % < > ! & | ^ . ~
  • 只有中置運算符可以繼承優(yōu)先級組 precdence(后面介紹)
  • 自定義運算符不可放在類中,必須放在文件作用域中

自定義后置運算符

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
}
// 文件作用域,即全局作用域,不可在class下
prefix operator +++
prefix func +++(coordinate: inout Coordinate) -> Coordinate {
    coordinate.x = coordinate.x + coordinate.x
    coordinate.y = coordinate.y + coordinate.y
    return coordinate
}
func test() {
    var p1 = Coordinate(x: 1.0, y: 1.0)
    print(+++p1) // Coordinate(x: 2.0, y: 2.0)
}

自定義前置運算符和自定義后置運算符類似

postfix operator +++
postfix func +++(coordinate: inout Coordinate) -> Coordinate {
    coordinate.x = coordinate.x + coordinate.x
    coordinate.y = coordinate.y + coordinate.y
    return coordinate
}

自定義中置運算符

precedencegroup MyPrecedence {
    // higherThan: AdditionPrecedence   // 優(yōu)先級, 比加法運算高
    lowerThan: AdditionPrecedence       // 優(yōu)先級, 比加法運算低
    associativity: none                 // 結(jié)合方向:left, right or none
    assignment: false                   // true代表是賦值運算符,false代表非賦值運算符
}
infix operator +++ : MyPrecedence  // 繼承 MyPrecedence 優(yōu)先級組(可選)
func +++(left: Int, right: Int) -> Int {
    return (left + right) * 2
}
func test() {
    print(3+++2)
}

借助自定義運算符,我們可以浪一浪,定義一個操作符,當(dāng)有值是使用此值,無值時使用想要的默認值,如下所示:

postfix operator <<<
postfix func <<<(a: String?) -> String { return a ?? "" }
func test() {
    print(getStr()<<<)
}
func getStr() -> String? {
    return nil
}

示例

postfix operator <<<
postfix func <<<(a: String?)              -> String              { return a ?? "" }
postfix func <<<(a: Int?)                 -> Int                 { return a ?? 0 }
postfix func <<<(a: Int8?)                -> Int8                { return a ?? 0 }
postfix func <<<(a: Int16?)               -> Int16               { return a ?? 0 }
postfix func <<<(a: Int32?)               -> Int32               { return a ?? 0 }
postfix func <<<(a: Int64?)               -> Int64               { return a ?? 0 }
postfix func <<<(a: UInt?)                -> UInt                { return a ?? 0 }
postfix func <<<(a: Double?)              -> Double              { return a ?? 0.0 }
postfix func <<<(a: Float?)               -> Float               { return a ?? 0.0 }
postfix func <<<(a: [AnyObject]?)         -> [AnyObject]         { return a ?? [] }
postfix func <<<(a: [String]?)            -> [String]            { return a ?? [] }
postfix func <<<(a: [Int]?)               -> [Int]               { return a ?? [] }
postfix func <<<(a: [String: AnyObject]?) -> [String: AnyObject] { return a ?? [:]}
postfix func <<<(a: [String: String]?)    -> [String: String]    { return a ?? [:] }

以上就是Swift之運算符重載示例詳解的詳細內(nèi)容,更多關(guān)于Swift運算符重載的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Swift Set集合及常用方法詳解總結(jié)

    Swift Set集合及常用方法詳解總結(jié)

    Set集合為集類型,集是最簡單的一種集合,存放于集中的對象不按特定方式排序,只是簡單地把對象加入集合中,類似于向口袋里放東西,對集中存在的對象的訪問和操作是通過對象的引用進行的,因此在集中不能存放重復(fù)對象
    2021-11-11
  • swift計步器CMPedometer的使用方法

    swift計步器CMPedometer的使用方法

    這篇文章主要為大家詳細介紹了swift計步器CMPedometer的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • swift中利用runtime交換方法的實現(xiàn)示例

    swift中利用runtime交換方法的實現(xiàn)示例

    這篇文章主要給大家介紹了關(guān)于swift中利用runtime交換方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-05-05
  • Swift Extension擴展得使用詳細介紹

    Swift Extension擴展得使用詳細介紹

    在swift中,extension與Objective-C的category有點類似,但是extension比起category來說更加強大和靈活,它不僅可以擴展某種類型或結(jié)構(gòu)體的方法,同時它還可以與protocol等結(jié)合使用,編寫出更加靈活和強大的代碼
    2022-09-09
  • Swift在什么情況會發(fā)生內(nèi)存訪問沖突詳解

    Swift在什么情況會發(fā)生內(nèi)存訪問沖突詳解

    這篇文章主要給大家介紹了關(guān)于Swift在什么情況會發(fā)生內(nèi)存訪問沖突的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Swift?中的?JSON?反序列化示例詳解

    Swift?中的?JSON?反序列化示例詳解

    這篇文章主要為大家介紹了Swift中的JSON?反序列化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • swift閉包和OC block類型的使用

    swift閉包和OC block類型的使用

    這篇文章主要介紹了swift閉包和OC block類型的使用,需要的朋友可以參考下
    2017-08-08
  • swift where與匹配模式的實例詳解

    swift where與匹配模式的實例詳解

    這篇文章主要介紹了swift where與匹配模式的實例詳解的相關(guān)資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下
    2017-07-07
  • Swift項目中利用SWRevealViewController實現(xiàn)側(cè)滑菜單

    Swift項目中利用SWRevealViewController實現(xiàn)側(cè)滑菜單

    這篇文章主要介紹了Swift項目中利用SWRevealViewController實現(xiàn)側(cè)滑菜單,需要的朋友可以參考下
    2015-12-12
  • swift中可選值?和!使用的方法示例

    swift中可選值?和!使用的方法示例

    這篇文章主要給大家介紹了關(guān)于swift中可選值?和!使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11

最新評論

凤冈县| 海南省| 嘉峪关市| 轮台县| 横山县| 湖北省| 辉南县| 荃湾区| 彝良县| 河曲县| 堆龙德庆县| 石台县| 榆中县| 建瓯市| 蒙自县| 元氏县| 凤阳县| 桐梓县| 彰化市| 射洪县| 伊川县| 巴林左旗| 清水河县| 固原市| 璧山县| 岳西县| 嘉兴市| 黄浦区| 安图县| 涟水县| 湟源县| 黑龙江省| 盐城市| 彭水| 铜山县| 云龙县| 惠州市| 益阳市| 马龙县| 社会| 诸城市|