Swift学习笔记18-高级运算符

张开发
2026/4/5 7:29:43 15 分钟阅读

分享文章

Swift学习笔记18-高级运算符
// // main.swift // class 18 高级运算符 // // Created by sakiko on 2026/4/2. // import Foundation print(Hello, World!) //溢出运算符Overflow Operator //Swift的算数运算符出现溢出时会抛出运行时错误 //Swift有溢出运算符(,-,*)用来支持溢出运算 /* : 安全地执行加法如果发生溢出则结果会在数据类型的最大值和最小值之间循环。 -: 安全地执行减法同样会在溢出时循环。 *: 用于乘法运算溢出时结果也是循环。 */ //UInt8的范围是0到255的整数 var min UInt8.min //(就是UInt8八位无符号整数的最大值) print(min - 1)//255 因为0-1会溢出所以变成UInt8的最大值了就是255 var max UInt8.max print(max 1)//0 2551也会溢出所以会从头开始循环。所以变成了UInt8是最小值了就是0 print(max * 2)//254,其实就是max * max //运算符重载Operator Overload //类、结构体、枚举可以为现有的运算符提供自定义的实现这个操作叫做运算符重载 struct Point { var x: Int, y: Int } func (p1: Point,p2: Point) - Point { Point(x: p1.x p2.x, y: p1.y p2.y) } let p Point(x: 10, y: 20) Point(x: 11, y: 22) print(p)//Point(x: 21, y: 42) //↑ 定义了 运算符的重载使得可以直接对 Point 类型的实例进行相加操作。它将两个 Point 对象的 x 和 y 属性进行相加并返回一个新的 Point 对象。 struct Point2 { var x: Int, y:Int static func (p1: Point2, p2: Point2) - Point2 { Point2(x: p1.x p2.x, y:p1.y p2.y) } } //就是a1的意思 struct Point3 { var x: Int, y:Int static func (p1: Point3, p2:Point3) - Point2 { //这个就是重载一个为了在结构体进行实例相加 Point2(x: p1.x p2.x, y: p1.y p2.y) } } struct Point4 { var x: Int, y:Int static func - (p1:Point4, p2:Point4) - Point4{ //这个就是重载一个-为了在结构体进行实例相加 Point4(x: p1.x - p2.x, y:p1.y - p2.y) } } struct Point5 { var x:Int, y:Int static prefix func - (p: Point5) - Point5 { //这里也是- Point5(x: -p.x, y:-p.y) } } //其实↓↓这里开始就不太懂了。。。 struct Point6 { var x:Int, y:Int static func (p1: inout Point6, p2: Point6) { //要在函数修改p1的数值所以要加inout p1 p2 //不知道为什么直接写p1 p1 p2用不了于是改成这样了 } static prefix func (p: inout Point6) - Point6 { p Point6(x: 1,y: 1) return p } static postfix func (p:inout Point6) - Point6 { let tmp p p Point6(x: 1, y: 1) return tmp } static func (p1: Point6, p2: Point6) - Bool { //这里是想等为真(假) (p1.x p2.x) (p1.y p2.y) } } //Equatable:系统协议用于查看2个实例是否等价。 //想要知道2个实例是否等价一般做法是遵守Equatable协议重载 运算符 //Swift为以下类型提供默认的Equalable实现 //1.没有关联类型的枚举关联类型给协议中(函数要用到的类型定义一个名称协议中可以拥有多个关联类型 //2.只拥有遵守Equatable协议关联类型的枚举 //3.只拥有遵守Equatable协议存储属性的结构体 struct Point7 : Equatable { var x: Int, y: Int } var p1 Point7(x: 10, y: 10) var p2 Point7(x: 10, y: 22) print(p1 p2) print(p1 ! p2) //引用类型比较存储的地址值是否相等是否引用着同一个对象使用恒等运算符、! /* :用于判断两个类实例是否引用同一个对象。如果两个实例确实引用同一对象则返回 true否则返回 false。 !:用于判断两个类实例是否不引用同一个对象。如果它们不指向同一对象则返回 true如果指向同一对象则返回 false。 */ //Comparable //score大的比较大若score相等age小的比较大(struct:Student) //要想比较2个实例的大小一般的做法是 //遵守Comparable协议重载相应的运算符 var stu1 Student(age: 100, socre: 20) var stu2 Student(age: 98, socre: 18) var stu3 Student(age: 100, socre: 20) print(stu1 stu2) print(stu1 stu2) print(stu1 stu3) print(stu1 stu3) print(stu2 stu1) print(stu2 stu1) //以上答案全部都是true //自定义运算符Custom Operator //可以自定义新的运算符在全局作用域中使用operator进行声明 //prefix operator 前缀运算符 //postfix operator 后缀运算符 //infix operator 中缀运算符优先级组 /* precedencegroup 优先级组{ associativity: //结合性 (left\right\none) higherThan: //比谁的优先级高 lowerThan: //比谁的优先级低 assignment: true //代表在可选链中拥有和赋值运算符一样的优先级 } */ prefix operator infix operator - : PlusMinusPrecedence precedencegroup PlusMinusPrecedence { associativity: none higherThan: AdditionPrecedence lowerThan: MultiplicationPrecedence assignment: true } //• Apple文档参考https://developer.apple.com/documentation/swift/swift_standard_library/operator_declarations //https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID380 //举例见Point1000 struct Person { var point: Point1000 } var person: Person? nil person?.point - Point1000(x: 10, y: 10)

更多文章