Swift开发第六篇——操作运算符也可以重载& func 的参数修饰

本篇分为两部分:

1、Swift 中重载操作运算符的使用

2、Swfit 中 func 的参数修饰


1、Swift 中重载操作运算符的使用

与别的语言不同,Swift 支持运算符的重载,运算符指的是“+,-,%,*”等操作运算符,从而使一些操作更加简便。

在开发中,我们对于一些基本运算通常是这样写的:

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

let v1 = Vector2D(x: 2, y: 3)
let v2 = Vector2D(x: 1, y: 4)
let v3 = Vector2D(x: v1.x+v2.x, y: v1.y+v2.y)

v3 的输出结果为:3,7

但是,当这种二位数组过多时,如果我们依然用这种方式,我们的代码将变得异常臃肿,程序员也会变得没有耐心,所以 Swift 为了提高工作效率,创造出了重载运算符这种文艺的编程方式,上面的代码可以优化为:

// Swift 支持重载操作符这样的特性,从而使一些计算更加简便
func +(left: Vector2D, right:Vector2D) -> Vector2D {
    return Vector2D(x: left.x + right.x, y: left.y + right.y)
}

let v = v1 + v2 + v3  // 再往后继续加都可以

v 的输出结果为:6,14

因为 +, -, * 这样的操作符是因为 Swift 中已经有定义了,所以不会保错,如果我们要加入新的操作符的话,需要先对其进行声明

infix operator +* {  // infix:表示要定义的是一个中位操作符,即前后都是输入;其他的修饰还包括 prefix 和 postfix
    associativity none  // associativity:定义结合律,规定计算顺序,加法减法为 left,点乘用 none
    precedence 160    // precedence:运算的优先级,Swift 中乘除的优先级是150,加减是140

}
func +*(left: Vector2D, right:Vector2D) -> Double {
    return left.x * right.x + left.y * right.y
}
let result1 = v1 +* v2

result1 的输出结果为:14.0

注意:Swift 的操作符是不能定义在局部域中的,因为至少会希望能在全局范围内使用你的操作符,否则操作符就失去意义了


2、Swfit 中 func 的参数修饰

在 Swift 中所有的变量都被默认为不可变的,也就是用 let 进行声明,在方法上也是如此,所以此代码会报错:func test(i: Int) -> Int

解决办法:

func incrementor(var i: Int) -> Int {
    return ++i
}
print("计算后的结果为:\(incrementor(7))")

输出结果:计算后的结果为:8

// 柯里化及多元组综合使用, inout 修饰符曾在多元组中使用
func makeIncrementor(addNumber: Int) -> ((inout Int) -> ()) {
    func incrementor(inout variable: Int) -> () {
        variable += addNumber;
        print(variable);
    }
    return incrementor;
}
var i = 2;
let addMethod = makeIncrementor(3)
addMethod(&i)
addMethod(&i)
addMethod(&i)
addMethod(&i)
时间: 2024-10-11 06:02:02

Swift开发第六篇——操作运算符也可以重载& func 的参数修饰的相关文章

C#语法糖之第六篇: 泛型委托- Predicate<T>、Func<T>

今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值.首先我们看一下它的定义吧: 1 public delegate bool Predicate<T>(T obj); 从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用

Swift开发第八篇——方法嵌套&amp;命名空间

本篇分为两部分: 一.Swift中的方法嵌套 二.Swift中的命名空间 一.Swift中的方法嵌套 在 swift 中我们可以让方法嵌套方法,如: func appendQuery(var url: String, key: String, value: AnyObject) -> String { func appendQueryDictionary(url: String, key: String, value: [String: AnyObject]) -> String { //..

Swift开发第五篇——四个知识点(Struct Mutable方法&amp;Tuple&amp;autoclosure&amp;Optional Chain)

本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方法 直接上代码: struct User { var weight: Int var height: Int // 这里会报错 Left side of mutating operator isn't mutable:'self' is immutable // 因为 Struct 出来的变量是 i

Swift开发第四篇——柯里化

本篇分为两部分: 一.柯里化的基本使用 二.柯里化的使用场景 一.柯里化的基本使用 柯里化(Currying):也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果的新方法. func addTwoNumbers(a: Int)(num: Int) -> Int { return a + num } 然后通过只传入第一个括号内的参数进行调用,这样将返回另一个方法 let addToFour = addTwoNumbers(4) let result = add

微信开发第六篇服务器主动发送信息

上几篇文章基本是介绍有手机客户端触发的事件在先,这种有手机微信客户端触发的请求,咱们的服务器被动响应,这种模式我个人理解为被动发送信息. 但是除此之外我们有时间要让用户推送消息,比如向家长每天发送孩子的作业信息.这就要用到模板消息了 对于模板消息首先要添加 进入模板选择行业之后就要等两天才能用模板消息 能用模板消息之后 根据自己的情况,查看模板选择适用于自己的模板 如果没有可以自己定义 只要微信官方审核通过就可以用(我申请的好像说是7-15天,完成审计,但是好像30分钟就给我发通知说申请成功)

Python学习【第六篇】运算符

运算符 算数运算: 1 a = 21 2 b = 10 3 c = 0 4 5 c = a + b 6 print ("1 - c 的值为:", c) 7 8 c = a - b 9 print ("2 - c 的值为:", c) 10 11 c = a * b 12 print ("3 - c 的值为:", c) 13 14 c = a / b 15 print ("4 - c 的值为:", c) 16 17 c = a %

软件工程迭代开发第六篇

今天更新了整个玩耍界面,学会了如何通过二维纹理载入图片. 最终界面如下: 下面的十个框框,左边五个是技能栏,右边五个是道具.这俩要等到整合之后才能体现. 实现方法: 将一张由我们美工画好的界面图加载到程序中并用OpenGL画出. 通过OpenGL的二维纹理加载画出. 在init中加载图片: //加载用户界面 p1.load_UI(ATLLoadTexture("res/hp.png")); 这个load_UI()函数是这样的: void Player::load_UI(int i) {

李洪强iOS开发Swift篇—04_运算符

李洪强iOS开发Swift篇—04_运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运算符:++.-- 比较运算符:==.!=.>.<.>=.<= 逻辑运算符:&&.||.! 三目运算符:? : 范围运算符:..< .... 溢出运算符:&+.&-.&*.&/.&% 2.赋值运算符 (1)1对1赋值 var

iOS开发笔记 - 语言篇之Swift

?2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布"We have new programming language"(我们有了新的编程语言)的时候,全场响起了最热烈和持久的掌声,伴随着掌声到来的语言叫Swift.接下来Craig Federighi更是毫不掩饰的告诉大家,Swift将成为主宰iOS和Mac开发的新语言,甚至是整个软件行业中最举足轻重的语言. ??Swift正如它的名字那样迅速.敏捷,但这并不是它的全部.Swift是一个博采众长的