除了算术运算符、逻辑运算符等基础的运算符外,Swift语言还提供了许多关于运算符的高级使用技巧。开发者甚至可以重新实现系统的运算符或者自定义特殊功能的运算符。
按位运算符
// 位运算,以UInt8类型二进制为例
print(MemoryLayout<UInt8>.size)// UInt8为无符号整数,1个字节长度,8bit,pow(2,7) = 256,包含0,所以范围是 0 - 255
var a:UInt8 = 0b1000 // pow(2,3) = 8
var fa = ~a // ~ 按位取反 0b11110111
var ya = 0b11110111&a // & 按位与运算 两位相同取1,不同取0
var ha = 0b11110111|a // | 按位或运算 两位有一位为1就取1
var yha = 0b11110111^a // ^ 按位异或 不同取1,同取0
// 按位左移和按位右移可能出现数据被截断的情况
var za = a<<1 // 按位左移 相当于 * 2
var yya = a>>1 // 按位右移
溢出运算符 &-算术运算符 与C的溢出相似,可以防止溢出时抛出异常
函数的重载
func addSum(_ parama1:Int,_ parama2:Int)->Int{
return parama1 + parama2
}
func addSum(_ parama1:Double,_ parama2:Double)->Double{
return parama1 + parama2
}
func addSum(_ parama1:String,_ parama2:String)->String{
return parama1 + parama2
}
var a = addSum(1, 2)
var b = addSum(2.3, 3.4)
var c = addSum("abc", "efg")
运算符的重载:因为运算符也是通过函数来实现的,所以可以重载
class Circle{
var centerPoint:(Double,Double)
var r:(Double)
init(centerPoint:(Double,Double),r:Double) {
self.centerPoint = centerPoint
self.r = r
}
}
func +(circle1:Circle,circle2:Circle)->Circle{
return Circle.init(centerPoint: (circle1.centerPoint), r: circle2.r)
}
var circle1 = Circle.init(centerPoint: (12.3,13.4), r: 55)
var circle2 = Circle.init(centerPoint: (22.3,23.4), r: 100)
var circle = circle1 + circle2 // 两圆相加
print(circle.centerPoint,circle.r)
自定义运算符
// 前缀
prefix operator ++
prefix func ++(Parama:Int)->Int {
return Parama + 1
}
// 中缀
infix operator ++
func ++(Parama1:Int,Parama2:Int)->Int{
return Parama1 * Parama2
}
// 后缀
postfix operator++
postfix func ++(Parama:inout Int)->Int{
let temp = Parama
Parama = Parama + 1
return temp
}
var a = 5
var b = ++a
var c = a++b
var d = a++
print(a,b,c,d)
自定义运算符注意事项:常使用如下字符作为开头:/、=、-、+、!、*、%、<、>、&、|、^、?、~ 当自定义运算符中包含“.”且置于开头时,运算符中可以出现多个“.”,但如果“.”不置于开头,那么自定义运算符中只能出现一个"."
中缀运算符优先级表
网友评论