美文网首页
Swift 基本语法(二)— 运算符

Swift 基本语法(二)— 运算符

作者: Eddiegooo | 来源:发表于2019-10-02 17:39 被阅读0次

swift 运算符
1.赋值运算符“=” 没有返回值, 比较运算符“==” 返回bool值。 这是swift比OC先进的地方。预防手误写错。

var a = 1
var b = 2
if a = b {
    print("a == b") //直接就报错了, 会提示是不是要写==比较操作
}
智能提示
let b = -4
print(9%4)// 1
print(9%b)  //1
print(-9%4)  //-1

2.Swift里算数运算符默认是不允许值溢出的。 保证代码和逻辑安全。 可以手动使用值溢出操作符,在算术运算符前面加&。 但是不建议。

3.合并控制运算符 ?? 实际上是一个三元运算符 a ?? b ===> a != nil ? a! : b 系统说前后两个变量类型必须一致,但是不一致也不报错。

let a: Int? = 9
let b = 4
print(a ?? b)  //9

let c = "count"
print(a ?? c) //9

print(b ?? c) //4

4.区间运算符
闭区间 ... 半开半闭 ..< 单侧区间 2..., 2..< ...6, ..>6
注意:写这个区间运算符时,必须紧挨着常量,不可以有空格。

5.位运算
与& 或| 非! 异或^ 左移<<相当于翻倍 右移>> 相当于减半

交换两个数值
var a = 8, b = 6
a = a ^ b
b = a ^ b
a = a ^ b
print(a, b) // 6 8

6.运算符优先级和结合性 自定义运算符

struct Vector2D {
    var x = 0
    var y = 0
}
//重载运算符 函数前面必须加static 修饰。。。
extension Vector2D {
   static func + (vec1: Vector2D, vec2: Vector2D) -> Vector2D {
        return Vector2D(x: vec1.x + vec2.x, y: vec1.y + vec2.y)
    }
}

//自定义一元运算符 必须在加前缀。 前缀运算符加prefix, 后缀运算符加postfix
extension Vector2D {
    prefix static func - (vec: Vector2D) -> Vector2D {
        return Vector2D(x: -vec.x, y: -vec.y)
    }
}
//重载组合赋值运算符  需要将左参数设置为可修改的 inout 类型
extension Vector2D {
    prefix static func += (left: inout Vector2D, right: Vector2D) -> Vector2D {
//        return Vector2D(x: left.x += right.x, y: left.y += right.y)
        left = left + right
    }
}

自定义运算符

struct Vector2D {
    var x = 0
    var y = 0
}
//自定义一个翻倍运算符 ++
//1.声明运算符
prefix operator ++
extension Vector2D {
     static prefix func ++(vec: Vector2D) -> Vector2D {
        return Vector2D(x: vec.x * 2, y: vec.y * 2)
    }
}
var vex = Vector2D(x: 3, y: 4)
print(++vex)  //  6 8

//为类或结构体自定义运算符
//自定义一个中缀运算符 +-
//1.声明运算符, 指定优先级
infix operator +-: AdditionPrecedence

extension Vector2D {
    static func +-(vec1: Vector2D, vec2: Vector2D) -> Vector2D {
        Vector2D(x: vec1.x + vec2.x, y: vec1.y - vec2.y)
    }
}


//自定义优先级的全新运算符
precedencegroup MyPrecedence {
    associatedtype: left  //指定结合性
    lowerThan: AdditionPrecedence  //指定优先级,这里指定比加法优先级低
}
infix operator +^+: MyPrecedence
extension Vector2D {
    static func +^+(left: Vector2D, right: Vector2D) -> {
        Vector2D(x: left.x + right.x * 2, y: left.y + right.y * 2)
    }
}
//这样自定义一个+^+,比加法运算符优先级低的新运算符就完成了

相关文章

网友评论

      本文标题:Swift 基本语法(二)— 运算符

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