Swift

Swift - Advanced Operators

2019-03-20  本文已影响0人  ienos

位操作符

支持在 C 中的所有位操作符

位非操作符

Perfix Operator : ~ + number; eg: 00001111 = ~11110000

let initalBits: UInt8 = 0b00001111
let invertedBits = ~initalBits // equal

位或操作符

Operator : |
1 | 0 = 1
1 | 1 = 1
0 | 0 = 0

let someBits: UInt8 = 0b10110010
let moreBits: UInt8 = 0b01011110
let combinedbits = someBits | moreBits

位异或操作符

Operator : ^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 0 = 0

let firstBits: UInt8 = 0b00010100
let otherBits: UInt8 = 0b00000101
let outputBits = firstBits ^ otherBits

位左移和右移操作符

左 << 1 bit * 2 、右 >> 1bit / 2

无符号整型位移

有符号整型位移

负 1 正 0

-4 | 10000100 | 11111011
-1 | 10000001 | 11111110
-5 | 10000101 | 11111001

溢出操作符

var potentialOverFlow = Int16.max
potentialOverFlow += 1
// this causes an error

&+

var unsignedOverflow = UInt8.max
unsignedOverflow = unsignedOverflow &+ 1
// unsignedOverflow is now equal to 0
/*
    0|11111111
    0|00000001
    1|00000000
*/

&-

var unsignedOverflow = UInt8.min
unsignedOverflow = unsignedOverflow &- 1
// unsignedOverflow is now equal to 255
/*
     0|0000000
  -  0|0000001
     1|1111111
*/

操作符方法

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 {
    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
    }
}

分配符 = 和 三元运算符 ?: 不能被重载

extension Vector2D: Equatable {
    static func == (left: Vector2D, right: Vector2D) -> Bool {
        return(left.x == right.x) && (left.y == right.y)
    }
}

以下默认提供等价运算符合成实现:

struct Vector3D: Equatable {
    var x = 0.0, y = 0.0, z = 0.0
}

let twoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0)
let anotherTwoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0)
if twoThreeFour == anotherTwoThreeFour {  
    print("These two vectors are also equivalent.")
}
// Prints "These two vectors are also equivalent."

自定义操作符

extension Vector2D {  
    static prefix func +++ (vector: inout Vector2D) -> Vector2D {
        vector += vector
        return vector
    }
}

var toBeDoubled = Vector2D(x: 1.0, y: 4.0)
let afterDoubling = +++toBeDoubled

优先级和自定义中缀操作符

infix operator +-: AdditionPrecedence
extension Vector2D {
    static func +- (left: Vector2D, right: Vector2D) -> Vector2D {
        return Vector2D(x: left.x + right.x, y: left.y - right.y)
    }
}
let firstVector = Vector2D(x: 1.0, y: 2.0)
let secondVector = Vector2D(x: 3.0, y: 4.0)
let plusMinusVector = firstVector +- secondVector
上一篇 下一篇

猜你喜欢

热点阅读