溢出运算符(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)
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)