美文网首页
26.高级运算符 Advanced Operators Swif

26.高级运算符 Advanced Operators Swif

作者: KevinFromChina | 来源:发表于2018-03-29 18:43 被阅读0次
    //: Playground - noun: a place where people can play
    
    import UIKit
    
    // 溢出行为都会作为错误而被捕获,除非使用溢出运算符.
    
    // #  位运算符
    // 对二进制有效
    // 位取反运算符~
    let initialBits: UInt8 = 0b00001111
    let invertedBits = ~initialBits // equals 0b11110000
    // 位与运算符&
    let firstSixBits: UInt8 = 0b11111100
    let lastSixBits: UInt8 = 0b00111111
    let middleFourBits = firstSixBits & lastSixBits // equals 0b00111100
    // 位或运算符|
    // 位异或运算符^
    
    // # 位左移和右移运算符
    // 无符号整型位移操作
    // 左移相当于翻倍,右移相当于减半,用0填充空位.不会改变原来的值.
    let shiftBits: UInt8 = 4
    shiftBits << 1
    shiftBits << 5
    // trick: 取出三原色
    let pink: UInt32 = 0xCC6699
    let redComponent = (pink & 0xFF0000) >> 16 // &还是作用于二进制,但是等效了
    let greenComponent = (pink & 0x00FF00) >> 8
    let blueComponent = pink & 0x0000FF
    
    // 有符号整型位移操作
    // 正数符号位是0,其他位算法和以前一样
    // 负数符号位是1,其他位存储的是2的n次方减去其绝对值,n是有效的存储位,比如Int8为7
    // 向左移动用0填充,如果感觉有问题了,那就是溢出了
    // 对有符号整数的右移有一个额外的规则:对于移位产生的空白位使用符号位进行填充,而不是 0 。
    
    // # 溢出运算符
    // &+ &- &*
    
    // # 优先级和结合性
    // 参见官方文档
    // trick: % * / 有相同的优先级
    
    // # 运算符函数
    struct Vector2D {
        var x = 0.0, y = 0.0
    }
    extension Vector2D {
        // 实际上相当于一个全局函数
        static func + (left: Vector2D, right: Vector2D) -> Vector2D {
            return Vector2D(x: left.x + right.x, y: left.y + right.y)
        }
    }
    extension Vector2D {
        // 前缀加上prefix,后缀加上postfix
        static prefix func - (vector: Vector2D) -> Vector2D {
            return Vector2D(x: -vector.x, y: -vector.y) // 一个单纯的前后缀是不能有空格的
        }
    }
    
    // 组合赋值运算符
    extension Vector2D {
        static func += (left: inout Vector2D, right: Vector2D) {
            left = left + right
        }
    }
    
    // 注意:不能对默认的赋值运算符( = )进行重载。只有组合赋值运算符可以被重载。同样地,也无法对三元条件运算符 a ? b : c  进行重载.
    
    // 等价运算符
    extension Vector2D {
        static func == (left: Vector2D, right: Vector2D) -> Bool {
            return (left.x == right.x) && (left.y == right.y)
        }
        static func != (left: Vector2D, right: Vector2D) -> Bool {
            return !(left == right)
        }
    }
    
    // # 自定义运算符
    // 提前定义运算符,注意限定符prefix infix postfix
    prefix operator +++
    extension Vector2D {
        static prefix func +++ (vector: inout Vector2D) -> Vector2D {
            vector += vector
            return vector
        }
    }
    
    // 自定义中缀优先级和结合性
    // 前后缀都是最优先的,如果同时对一个操作数使用前后缀,则后缀先执行
    // 默认:比三元条件运算符高一点
    infix operator +-: AdditionPrecedence // 和+,-运算符一样的优先性和结合律
    extension Vector2D {
        static func +- (left: Vector2D, right: Vector2D) -> Vector2D {
            return Vector2D(x: left.x + right.x, y: left.y - right.y)
        }
    }
    
    
    

    相关文章

      网友评论

          本文标题:26.高级运算符 Advanced Operators Swif

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