Swift --- 高级运算符

溢出运算符(Overflow Operator)

  • Swift的算数运算符出现溢出时会抛出运行时错误
  • Swift有溢出运算符(&+、&-、&*),用来支持溢出运算符
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

运算符重载

在这里插入图片描述

struct Point {
    var x = 0, y = 0
    static func + (p1: Point, p2: Point) -> Point {
        Point(x: p1.x + p2.x, y: p1.y + p2.y)
    }
}
//func + (p1: Point, p2: Point) -> Point {
//    Point(x: p1.x + p2.x, y: p1.y + p2.y)
//}
var p1 = Point(x: 10, y: 20)
var p2 = Point(x: 11, y: 22)
let p3 = p1 + p2       
print(p3)  //Point(x: 21, y: 42)

Equatable协议

  • 要想得知2个实例是否等价,一般做法是遵守Equatable协议,重载 == 运算符
  • 与此同时,等教育重载了 != 运算符
class Person : Equatble {
    var age: Int
    init(age: Int) {
        self.age = age
    }
    static func == (lhs: Person, rhs: Person) -> Bool {
        lhs.age == rhs.age
    }
}
var p1 = Person(age: 10)
var p2 = Person(age: 10)
print(p1 == p2)

Swift为以下类型提供默认的Equatable实现:

  • 没有关联类型的枚举
enum Anser {
    case wrong
    case right
}
var s1 = Answer.wrong
var s2 = Answer.right
print(s1 == s2)
  • 只拥有遵守Equatable协议关联类型的枚举
enum Anser : Equatable {
    case wrong(int, String)
    case right
}
var s1 = Answer.wrong(10, "Jack")
var s2 = Answer.wrong(10, "Jack")
print(s1 == s2)
  • 只拥有遵守Equatable协议存储属性的结构体
struct Point : Equatable {
    var x = 0, y = 0
}
var p1 = Point(10, 20)
var p2 = Point(10, 20)
print(p1 == p2)
  • 引用类型比较存储的地址值是否相等(是否引用着同一个对象),使用恒等运算符 === 、!==

Comparable协议

  • 想要比较两个实例的大小,一般做法是:

1.遵守Comparable协议
2.重载相应的运算符

struct Student : Comparable {
    var age: Int
    var score: Int
    init(score: Int, age: Int) {
        self.score = score
        self.age = age
    }
    static func < (lhs: Student, rhs: Student) -> Bool {
        (lhs.score < rhs.score) || (lhs.score == rhs.score && lhs.age > rhs.age)
    }
    static func > (lhs: Student, rhs: Student) -> Bool {
        (lhs.score > rhs.score) || (lhs.score == rhs.score && lhs.age < rhs.age)
    }
    static func <= (lhs: Student, rhs: Student) -> Bool {
        !(lhs > rhs)
    }
    static func >= (lhs: Student, rhs: Student) -> Bool {
        !(lhs < rhs)
    }
    
}
var stu1 = Student(score: 100, age: 20)
var stu2 = Student(score: 98, age: 18)
var stu3 = Student(score: 100, age: 20)

print(stu1 > stu2) // true
print(stu1 >= stu2) // true
print(stu1 >= stu3) // true
print(stu1 <= stu3) // true
print(stu2 < stu1) // true
print(stu2 <= stu1) // true

自定义运算符(Custom Operator)

在这里插入图片描述
在这里插入图片描述
Apple文档参考

prefix operator +++
prefix func +++ (_ i: inout Int) {
    i += 2
}
var age = 10
+++age
infix operator +- : PlusMinusPrecedence //自己定义的
precedencegroup PlusMinusPrecedence {
    associativity: none
    higherThan: Additionprecedence     //官网查找
    lowerThan: MultiplicationPrecedence//官网查找
    assignment: true
}
struct Point :Equatable {
    var x = 0, y = 0
    static +- (p1: Point, p2: Point) -> Point {
        Point(x: p1.x + p2.x, y: p1.y - p2.y)
    }
}
var p1 = Point(x: 10, y: 20)
var p2 = Point(x: 5, y: 15)
var p3 = p1 +- p2
print(p3) //Point(x: 15, y: 5)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值