/* Advanced Operators -> 更新到XCode Beta5 1.默认运算是不可以溢出的,否则报错。 如果是故意溢出,但是swift提供了一组已&开头的运算符 &+可以溢出。 5个可溢出操作 &+ &- &* &/(除0操作返回0) &% var a:UInt8 = 255 &+ 1; //结果为0 ✨✨var a:UInt8 = 300 &+ 1;这个算式编译会报错,因为swift自动推倒类型后, 后面两个加法都是UInt8的,300范围外,会报如下错误: Integer literal overflows when stored int UInt8.(即当把300存到Uint8时出错) 2.操作符重载 中缀运算符如+-等不需要特殊标示,混合赋值语句 += 也不需要加特殊标示 前置++用 prefix 后置++用postfix;注意新版本中去掉了@,=运算符不再需要assignment修饰 前置的还有一种情况就是只有一个+或者减号 3.自定义新的运算符需要先声明再定义,声明中需要infix,prefix,postfix说明,定义中infix不需要。 一元运算符需要指明前置,和后置,括号中的结合性,优先级不需要指定。 infix operator +- { associativity left precedence 140 } //声明 func +- (l, r){} //定义 */ //Bitwise operator let temp:UInt8 = 0b00001111 //NOT 按位取反 println("~temp: \(~temp)")//0b11110000 //Bitwise And 按位与 println(temp & (~temp))//0b00000000 //Bitwise OR 按位或 println(temp | (~temp))//0b11111111 //Bitwise XOR 按位异或 ^ //Bitwise Left and Right Shift Operators << >> //无符号数左右移动后补零 //有符号数最高位保持不变,其余位左移动时右边补零,右移动时负数补1正数补 0 //操作符重载,这里conform Printable协议,可以用println直接输出。 struct Vector2D: Printable { var x = 0.0, y = 0.0 // Printable协议 var description:String { get { return "x: \(x), y: \(y)" } } } //+ func + (l: Vector2D, r: Vector2D) -> Vector2D { return Vector2D(x: l.x + r.x, y: l.y + r.y) } //- func - (l: Vector2D, r: Vector2D) -> Vector2D { return Vector2D(x: l.x - r.x, y: l.y - r.y) } //postfix ++ 并且实现赋值功能 postfix func ++ (inout v: Vector2D) -> Vector2D { return Vector2D(x: v.x++, y: v.y++) } //prefix ++ prefix func ++ (inout v: Vector2D) -> Vector2D { return Vector2D(x: ++v.x, y: ++v.y) } //prefix - prefix func - (inout v: Vector2D) -> Vector2D { return Vector2D(x: -v.x, y: -v.y) } //== func == (l: Vector2D, r: Vector2D) -> Bool { return ( (l.x == l.x) && (l.y == r.y) ) ? true : false; } //!= func != (l: Vector2D, r: Vector2D) -> Bool { return ( (l.x == l.x) && (l.y == r.y) ) ? false : true; } func += (inout l:Vector2D, r:Vector2D) { l = l + r//这里可以直接用前面实现的加法运算;a += b; a 是第一个左参数,b是第二个右参数 } var v1 = Vector2D(x:1.0, y:3.0) var v2 = Vector2D(x:1.0, y:1.0) println("v1+v2: \(v1+v2)") var v3 = v2 + ++v1 println("v2 + ++v1 : \(v3)") println(v1) v1 = Vector2D(x:1.0, y:3.0) v3 = v2 + v1++ println(v3) println(v1) //可以自定义符号, = - + * % < > ! & | ^ . ~,开头的符号即可。 //新符号定义前需要声明✨✨,声明中需要用infix,prefix,postfix符号 infix operator +- { associativity left precedence 140 } //当定义前置和后置运算符时,{}中的内容不可以定义,默认为最高级别的。 func +- (l:Vector2D, r: Vector2D) ->Vector2D { return Vector2D(x: l.x + r.x, y: l.y - r.y) } //定义的时候不需要用infix,声明的时候需要。 /*Language Reference->Expression->Binary Expressions的介绍 Exponentiative (No associativity, precedence level 160) << Bitwise left shift >> Bitwise right shift Multiplicative (Left associative, precedence level 150) * Multiply / Divide % Remainder &* Multiply, ignoring overflow &/ Divide, ignoring overflow &% Remainder, ignoring overflow & Bitwise AND Additive (Left associative, precedence level 140) + Add - Subtract &+ Add with overflow &- Subtract with overflow | Bitwise OR ^ Bitwise XOR Range (No associativity, precedence level 135) ..< Half-open range ... Closed range Cast (No associativity, precedence level 132) is Type check as Type cast Comparative (No associativity, precedence level 130) < Less than <= Less than or equal > Greater than >= Greater than or equal == Equal != Not equal === Identical !== Not identical ~= Pattern match Conjunctive (Left associative, precedence level 120) && Logical AND Disjunctive (Left associative, precedence level 110) || Logical OR Nil Coalescing (Right associative, precedence level 110) ?? Nil coalescing Ternary Conditional (Right associative, precedence level 100) ?: Ternary conditional Assignment (Right associative, precedence level 90) = Assign *= Multiply and assign /= Divide and assign %= Remainder and assign += Add and assign -= Subtract and assign <<= Left bit shift and assign >>= Right bit shift and assign &= Bitwise AND and assign ^= Bitwise XOR and assign |= Bitwise OR and assign &&= Logical AND and assign ||= Logical OR and assign */ //《完》