美文网首页带我飞2程序员SwiftBlog
Swift 中的重载运算符和自定义运算符

Swift 中的重载运算符和自定义运算符

作者: 梁杰_numbbbbb | 来源:发表于2015-09-17 21:02 被阅读1171次

作者:Raj Kandathi,原文链接,原文日期:2015/09/12
译者:pmst;校对:千叶知风;定稿:shanks

重载运算符

有时候,我们会遇到需要对自定义的类(class)或结构体(struct)支持某些运算符功能,例如+,-,*,/等。以魔方收集者(Cube Collector)游戏为例,初期你怀揣一个渺小的魔方,身处一个充斥各种尺寸魔方的空间中。你的任务是找寻新的魔方,并通过"吞噬"新魔方来进化你手中的魔方。(译者注:吞噬解释为原始魔方尺寸加上新的魔方尺寸得到进化后的魔方)

魔方(Cube)类定义如下:

struct Cube{
  var side:Double   //定义魔方边长
}

在面向对象编程中,实现魔方之间"吞噬"(相加)的功能是往Cube结构体中添加一个加法的方法,具体实现代码如下:

struct Cube {
  var side: Double
    
  // 译者注: 结构体中,定义的方法修改内部定义变量值时,该方法必须添加mutating关键字
  mutating func add(newCube: Cube) {
    self.side += newCube.side
  }
}

var myCube = Cube(side: 10.0)       
let foundCube1 = Cube(side: 5.0)

myCube.add(foundCube1)
print(myCube.side, appendNewline: true)

除了在结构体中定义add函数实现方式之外,我们更期望使用+运算符来实现Cube魔方之间的相加,就比如通过下面这种方式:

let newCube = myCube + foundCube1

通过重载已存在的运算符(例如+ - * /)的方式,Swift允许我们对类或结构体进行运算操作。重载已存在的运算符,言外之意即支持新的数据类型的运算操作。两个魔方(Cube)之间的相加函数定义如下:

func + (lhsCube: Cube, rhsCube: Cube) -> Cube {
  var resultCube = Cube(side: 0.0)
  resultCube.side = lhsCube.side + rhsCube.side
  return resultCube
}

let existingCube = Cube(side: 10.0)
let foundCube2 = Cube(side: 20.0)
let newCube = existingCube + foundCube2
print(newCube.side, appendNewline: true)

需要注意的是,重载运算函数(如上+(lhsCube:rhsCube:)函数)无法在自定义的类或结构体内声明,重载运算符函数只允许在全局作用域下有效!

自定义运算符

前文"Cube Collection"游戏不妨再加入一个“宝箱”玩法,每一次玩家收集到一个宝箱,他/她所拥有的魔方尺寸就放大三倍(边长side * 3)。为了实现这个游戏机制,我们创建一个自定义运算符。通常,我们需要为这个自定义运算符命名,指定类型指定优先级以及结合性。想要知道更多这四个方面的知识,请参阅苹果官方文档。既然宝箱的作用是使得魔方尺寸放大三倍,不妨我们将这个自定义运算符命名为***,结合性采用后缀方式(译者注:等价于a++中的++作用)。其中将传入运算符操作函数的变量类型用inout关键字修饰声明。代码如下:

postfix operator *** {}
postfix func *** (inout myCube: Cube){
  myCube.side = myCube.side * 3
}

var myCube = Cube(side: 10.0)
myCube***
print(myCube.side, appendNewline: true)//swift2.0新特性 Xcode7下支持

正如你所看到的,重载已存在的运算符以及自定义运算符在Swift是如此简单。不过重载已存在运算符时,请引起足够重视,防止一些意外情况发生。

相关文章

  • swift重载或自定义操作符

    重载运算符 在Swift中,类和结构体是可以提供现有运算符的自定义实现,也就是重载现有运算符。三元运算符(a?b:...

  • swift 应用

    //swift 暴露 objc 调用 //swift 调用 objc //自定义表达式模式 (重载运算符 ~=,自...

  • 每天学一点Swift----运算符与表达式(一)

    Swift中允许重载运算符,也可以自定义运算符。 一.赋值运算符(=) 1.同Java,C语言相同,将等号右边的值...

  • 如何为类和结构体自定义运算符实现

    运算符重载 类和结构体可以为现有的运算符提供自定义的实现,称为运算符重载。 一元运算符重载 类与结构体也能提供标准...

  • 为类和结构体自定义运算符实现

    运算符重载 类和结构体可以为现有的运算符提供自定义的视线,称为运算符重载 一元运算符重载 类与结构体也能提供标准一...

  • 在Swift中定义自己的运算符

    自定义运算符 除了实现标准运算符,在 Swift 中还可以声明和实现自定义运算符。 新的运算符要在全局作用域内,使...

  • C# 第三节

    C# 运算符重载 您可以重定义或重载 C# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算...

  • chapter13 运算符重载

    python中的运算符重载 不能重载内置类型的运算符 不能新建运算符,只能重载现有的 is, and, or 和n...

  • 运算符重载

    对于内置的数据类,编译器直到如何进行运算 对于自定义数据类型,需要运算符重载 加号运算符重载 左移运算符重载 重载...

  • C++ 部分运算符重载

    可重载的运算符 不可重载的运算符和符号 重载运算符为类的成员函数 重载运算符为友元函数 重载赋值运算符 重载流插入...

网友评论

    本文标题:Swift 中的重载运算符和自定义运算符

    本文链接:https://www.haomeiwen.com/subject/tvjbcttx.html