Swift 特性 2 - 自定义运算符

SwiftiBcker • 于 2015-09-08 12:13:16 +0800 • 最后由 iBcker2015-11-10 22:22:20 +0800 1950 阅读

有了运算符重载,能简单的实现自定义对象的运算操作。如果还不够用,可以试试另一特性:自定义运算符

例如要定义一个+++的操作

新的运算符声明需在全局域使用operator关键字声明,可以声明为前置,中置或后置的。其中前置可以用@prefix修饰符,见代码: operator prefix +++ {}

然后我们定义个向量结构体 struct Vector2D { var x = 0.0 var y = 0.0 }

现在要实现+++的操作是把Vector2D里的x和y都乘以3

所以结果应该是 var toBeDoubled = Vector2D(x: 1.0, y: 4.0) let afterDoubling = +++toBeDoubled //x=3,y=12

整理一下思路:

``` struct Vector2D { var x = 0.0 var y = 0.0 }

operator prefix +++ {}

@prefix @assignment func +++ (inout vector: Vector2D) -> Vector2D { vector = Vector2D(x: vector.x * 3, y: vector.y * 3) return vector; }

var toBeDoubled = Vector2D(x: 1.0, y: 4.0) let afterDoubling = +++toBeDoubled

```

相关修饰符有

@prefix:前置

@infix:中置

@postfix:后置

operator:自定义运算符定义符

@assignment:自赋值修饰符(见运算符重载

本帖已被设为精华帖!
回复: 3
  • Xcodeee 2015-11-03 18:19:07 +0800

    谢邀!有料哦

  • tgz 2015-11-10 21:05:57 +0800

    这个特性非常爽。比如Eureka内添加TableViewCell的时候,将向数组添加元素的方法整合为一个 <<<操作符 ` infix operator <<<{ associativity left precedence 100 }

    public func <<<(left: Section, right: BaseRow) -> Section { left.append(right) return left } 这样向Section内添加Row的时候,不需要不停地append,只需要 Section <<< Row(){} <<< Row(){} <<< Row(){} `

  • iBcker 2015-11-10 22:22:20 +0800

    @tgz 我倒是觉得易读性变差了,大家都这么玩很容易把代码搞得很乱。

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,见 Emoji cheat sheet
  • @name 会链接到用户页面,并会通知他
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
Ctrl+Enter