当前位置: > > > Swift - 运算符重载和运算符函数

Swift - 运算符重载和运算符函数

(本文代码已升级至Swift3)

让已有的运算符对自定义的类和结构进行运算或者重新定义已有运算符的运算规则,这种机制被称为运算符重载。

1,通过重载加号运算符,使自定义的两个坐标结构体对象实现相加:
struct CenterPointer{
	var x=0, y=0
}

func + (left:CenterPointer, right:CenterPointer) -> CenterPointer{
	return CenterPointer(x:left.x+right.x, y:left.y+right.y)
}

let pointer1 = CenterPointer(x:2, y:3)
let pointer2 = CenterPointer(x:4, y:5)
let pointer3 = pointer1 + pointer2

2,重载判断运算符
,实现判断自定义类型是否相等
func == (left:CenterPointer, right:CenterPointer) -> Bool {
	return (left.x == right.x) && (left.y == right.y)
}

func != (left:CenterPointer, right:CenterPointer) -> Bool {
	return !(left == right)
}

3,组合运算符
,即将其他运算符和赋值运算符组合在一起,注意要把运算符左参数设置成inout类型
func += (left:inout CenterPointer, right:CenterPointer){
    left = left + right
}

var pointer1 = CenterPointer(x:2, y:3)
var pointer2 = CenterPointer(x:4, y:5)
pointer1 += pointer2
评论4
  • 4楼
    2016-12-30 20:26
    逆夏夏

    return CenterPointer(x:left.x+right.y, y:left.y+right.y)

    right.y不是right.x? 航哥没打错么

    站长回复

    这个确实是我手误。多谢你的提醒,现已修改。

  • 3楼
    2016-12-29 10:40
    沫沫

    func += ( left:inout CenterPointer, right:CenterPointer){
    left = left + right
    }

    站长回复

    多谢提醒,代码已更新。

  • 2楼
    2016-04-21 17:14
    苹果不青

    我在xcode中敲 为什么一直报错啊?xcode7.2的,错误如下
    1.Operators are only allowed at global scope
    2 Consecutive declarations on a line must be separated by ';'
    3.Expected declaration
    func + (left:CenterPointer , right:CenterPointer)-> CenterPointer{
    return CenterPointer(x:left.x+right.x , y:left.y+right.y)
    }

    let pointer1 = CenterPointer(x: 2, y: 3)
    let pointer2 = CenterPointer(x: 4, y: 5)
    1.Instance member 'pointer1' cannot be used on type 'ViewController'
    let pointer3 = pointer1 + pointer2

    站长回复

    应该是代码放的位置有问题,结构体定义和运算符重载要放在外面,比如:

    import UIKit
    import SwiftHTTP
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let pointer1 = CenterPointer(x:2, y:3)
            let pointer2 = CenterPointer(x:4, y:5)
            let pointer3 = pointer1 + pointer2
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
    
    struct CenterPointer{
        var x=0, y=0
    }
    
    func + (left:CenterPointer, right:CenterPointer) -> CenterPointer{
        return CenterPointer(x:left.x+right.y, y:left.y+right.y)
    }
    

  • 1楼
    2016-03-02 12:09
    11111111

    屏幕快照 2016-03-02 下午12.05.55  我想请问一下,为什么一直出现这种情况呢

    站长回复

    ??? 你描述的问题我看不到