Swift赋值和算术运算符

2019-10-08  本文已影响0人  Rathen

基本概念

Swift 运算符的改进

Swift 在支持 C 中的大多数标准运算符的同时也增加了一些排除常见代码错误的能力:

赋值运算符
算术运算符 - 标准运算符
算术运算符 - 余数运算符
算术运算符 - 一元
溢出运算符
溢出加法 ( &+ )
溢出减法 ( &- )
溢出乘法 ( &* )
值溢出
合并空值运算符

区间运算符

闭区间运算符
半开区间运算符
单侧区间
字符串索引区间
倒序索引

位运算符

位取反运算符
位与运算符
位或运算符
位异或运算符
位左移和右移运算符
无符号整数的移位操作
有符号整数的移位操作
补码表示的优点

位运算符经典算法

两个数字交换

不借助临时变量,交换两个变量的值。

var a = 10
var b = 9
a = a ^ b
b = a ^ b
a = a ^ b
print("a = \(a), b = \(b)")
求无符号整数二进制中 1 的个数

思路:看一个八位整数 10 100 001 ,先判断最后一位是否为 1 ,而“与”操作可以达 到目的。可以把这个八位的数字与 00000001 进行“与”操作。如果结果为 1 ,则表示 当前八位数的最后一位为 1 ,否则为 0 。怎么判断第二位呢?向右移位,再延续前面的 判断即可。

func countOfones(num: UInt) -> UInt {
    var count: UInt = 0
    var temp = num
    while temp != 0 {
        count += temp & 1
        temp = temp >> 1
    }
    return count
}

如果整数的二进制中有较多的 0 ,那么我们每一次右移一位做判断会很浪费,怎么改进 前面的算法呢?有没有办法让算法的复杂度只与“1”的个数有关?

运算符重载

类和结构体可以为现有的运算符提供自定义的实现,称为运算符重载。

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 = Vector2D(x: left.x + right.x, y: left.y + right.y)
    }
}
一元运算符重载
组合赋值运算符重载
等价运算符重载
等价运算符重载

只拥有遵循 Equatable 协议存储属性的结构体
Swift 为以下自定义类型提供等价运算符合成实现:
只拥有遵循 Equatable 协议关联类型的枚举 没有关联类型的枚举

自定义运算符
上一篇 下一篇

猜你喜欢

热点阅读