swift操作符的重载,自定义操作符

Swift之深入解析如何自定义操作符 一、Swift 运算符 运算符是一个符号,用于告诉编译器执行一个数学或逻辑运算。 Swift 提供了以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 区间运算符 其它运算符 ① 算术运算符 如下所示,列出了 Swift 语言支持的算术运算符,其中变量 A 为 10,变量 B 为 20: 运算符 描述 实例 + 加号 A + B 结果为 30 − 减号 A − B 结果为 -10 * 乘号 A * 阅读详情

作者:
声明:转发本文,请联系作者授权

操作符的重载和自定义在objective-c上是不支持的,属于swift从别的语言中借鉴过来一种新的姿势。下面让我们一个矩形为例子一起在操作符的世界溜达一圈,一窥其中的风景吧。

声明一个矩形结构体

struct Rectangle {
    public var point:CGPoint = CGPoint.zero
    public var bouns:CGSize = CGSize.zero

    init(X x:CGFloat,Y y:CGFloat,width w:CGFloat,height h:CGFloat) {
        self.point = CGPoint.init(x: x, y: y)
        self.bouns = CGSize.init(width: w, height: h)
    }
}

重载系统已有的操作符

extension Rectangle {

    // MARK:- 重载已有操作符
    /// 比较两个矩形的面积大小
    ///
    /// - Parameters:
    ///   - lhs: 第一个矩形
    ///   - rhs: 第二个矩形
    /// - Returns: 比较结果
    static func >=(lhs:Rectangle,rhs:Rectangle) -> Bool{

        return lhs.bouns.width * lhs.bouns.height >= rhs.bouns.width * rhs.bouns.height
    }

    /// 比较两个矩形是为同一个矩形
    ///
    /// - Parameters:
    ///   - lhs: 第一个矩形
    ///   - rhs: 第二个矩形
    /// - Returns: 比较结果
    static func == (lhs:Rectangle,rhs:Rectangle) ->Bool{
        return lhs.point.equalTo(rhs.point) && lhs.bouns.equalTo(rhs.bouns)
    }

    /// 比较两个矩形是否不为同一个矩形
    ///
    /// - Parameters:
    ///   - lhs: 第一个矩形
    ///   - rhs: 第二个矩形
    /// - Returns: 比较结果
    static func != (lhs:Rectangle,rhs:Rectangle) ->Bool{
       return !(lhs == rhs)
    }
  }

自定义一个操作符

Swift中已经定义了+,-,*,/等基本运算的操作符,假如需要自定义的操作符,以自定义操作符 ^^为列子(^^定义为求出两个矩形交集区域)

precedencegroup的定义
struct PrecedenceGroup {
  enum Associativity { case left, right, none }
  let associativity: Associativity
  let higherThan: [StaticString]
  let lowerThan: [StaticString]
  let assignment :Bool
}
  • Associativity 操作符的结合律
  • higherThan 该操作符比某(系统或者自定义的)操作符的优先级高
  • lowerThan 该操作符比某个(系统或者自定义的)操作符的优先级低
  • assignment 该操作符是否为赋值操作符

定义一个操作符

precedencegroup MyPrecedence {
    lowerThan: AdditionPrecedence      
    associativity: left                 
    assignment: false                   
}
infix operator ^^: MyPrecedence  //声明操作符 ^^
  • infix 中位操作符 例如: ==、>=、<等操作符
  • prefix 前置操作符 例如++i、!等操作符
  • postfix 后置操作符 例如i++、i--

实现操作符方法

extension Rectangle {

    private func convertToRect() ->CGRect {
        return CGRect.init(origin: self.point, size: self.bouns)
    }

    static func ^^ (lhs:Rectangle,rhs:Rectangle) ->Rectangle {
        let r1:CGRect = lhs.convertToRect();
        let r2:CGRect = rhs.convertToRect();
        let result:CGRect = r1.intersection(r2)
        return Rectangle.init(X: result.minX,
                              Y: result.minY,
                              width: result.width,
                              height: result.height)
    }
}

使用

        let r1:Rectangle = Rectangle.init(X: 0, Y: 0, width: 20, height: 30)
        let r2:Rectangle = Rectangle.init(X: 0, Y: 0, width: 30, height: 30)
        let r3:Rectangle = Rectangle.init(X: 0, Y: 0, width: 20, height: 20)
        let r4:Rectangle = Rectangle.init(X: 0, Y: 0, width: 30, height: 30)
        print("r1 >= r2 is \(r1 >= r2)")
        print("r2 == r3 is \(r2 == r4)")
        print("r3 == r4 is \(r3 == r4)")
        print("r3 != r4 is \(r3 != r4)")
        print("r2 与 r3 相交的区域\(r2 ^^ r3)")

//      r1 >= r2 is false
//      r2 == r3 is true
//      r3 == r4 is false
//      r3 != r4 is true
//      r2 与 r3 相交的区域Rectangle(point: (0.0, 0.0), bouns: (20.0, 20.0))

参考链接

https://github.com/apple/swift-evolution/blob/master/proposals/0077-operator-precedence.md

http://swifter.tips/operator/

附录:系统定义的操作符

操作符描述结合律Precedence group关键字
<<左移操作NoneBitwiseShiftPrecedence
>>右移操作NoneBitwiseShiftPrecedence
*乘法Left associativeMultiplicationPrecedence
/除法Left associativeMultiplicationPrecedence
%取余Left associativeMultiplicationPrecedence
&*乘以,忽略溢出Left associativeMultiplicationPrecedence
&按位ANDLeft associativeMultiplicationPrecedence
+加法Left associativeAdditionPrecedence
-减法Left associativeAdditionPrecedence
&+溢出加法Left associativeAdditionPrecedence
&-溢出减法Left associativeAdditionPrecedence
|位运算 orLeft associativeAdditionPrecedence
^按位异或操作Left associativeAdditionPrecedence
..<左闭右开区间NoneRangeFormationPrecedence
…闭区间NoneRangeFormationPrecedence
is类型检测Left associativeCastingPrecedence
as, as?, and as!类型转换Left associativeCastingPrecedence
??nil缺省值Right associativeNilCoalescingPrecedence
<小于NoneComparisonPrecedence
<=小于或者等于NoneComparisonPrecedence
>大于NoneComparisonPrecedence
>=大于或者等于NoneComparisonPrecedence
=等于NoneComparisonPrecedence
!=不等于NoneComparisonPrecedence
===比较的是否为同一指针NoneComparisonPrecedence
!=不等于NoneComparisonPrecedence
!==比较的不是同一指针NoneComparisonPrecedence
~=模式匹配(说明)NoneComparisonPrecedence
&&逻辑ANDLeft associativeLogicalConjunctionPrecedence
||逻辑ORLeft associativeLogicalConjunctionPrecedence
?:三目运算符Right associativeTernaryPrecedence
=赋值操作Right associativeAssignmentPrecedence
*=乘等操作Right associativeAssignmentPrecedence
/=除等操作Right associativeAssignmentPrecedence
%=余等操作Right associativeAssignmentPrecedence
+=加等操作Right associativeAssignmentPrecedence
-=减等操作Right associativeAssignmentPrecedence
<<=左位移等操作Right associativeAssignmentPrecedence
>>=右位移等操作Right associativeAssignmentPrecedence
&=按位AND等操作Right associativeAssignmentPrecedence
|=按位OR等操作Right associativeAssignmentPrecedence
^=按位异或等操作Right associativeAssignmentPrecedence
MISRA C 详解 · 专栏06:2023 与 2025 更新总览(相对 2012 的差异) 本专栏 01~05 篇基于(143 规则 + 16 指令)。这六年间标准又前进了两步——(大改)和(微调)。本文补充说明「相对 2012,标准变在哪」,并给出新增规范的代表性示例。 阅读详情

相关推荐

springboot源码 红色J_通达信副图指标源码之,出手就赢

今天跟大家分享一个通达信副图指标源码,本指标没有未来函数,因为本指标没有卖点提示,所以本指标需配合主图指标使用效果会更好,简单易懂,很容易明白,所以就不过多介绍使用方法了,以下是指标的贴图。风险提示!股市有风险买卖需谨慎,本指标只做参考建议,不做买卖交易结果,自己要对自己交易结果的盈亏负责,以下是指标的源码。VAR2:=REF(LOW,1);VAR3:=SMA(ABS(LOW-VAR2),3,1)...

weixin_39859909的博客 2847

Swift关键字总结上篇

Swift 中有多少关键字? 在Swift官方文档的词汇结构中, 有非常多的关键字, 它们被用于声明中、语句中、表达式中、类中、模式中, 还有以数字符号#开头的关键字, 以及特定上下文环境使用的关键字。 本文中涉及的代码可以在这里下载代码资源。 另外, 在特性中还有一些关键字, 是以@开头的关键字。这些所有的关键字将在 Swift 之关键字总结上篇 和 Swift 之关键字总结下篇 两篇文章

DCSnail-蜗牛 4792

3D识别建模 — 基于ReconstructMe和EAGLE EYES SCANNER的实现

3D实体识别建模,作为3D打印反向工程的一个重要环节,今天就让我们利用ReconstructMe和EAGLE EYES SCANNER来了解一下。 第一步、软件和硬件准备就绪 ReconstructMe下载并安装 http://reconstructme.net/?wpdmdl=160 EAGLE EYES SCANNER直接将相应USB插入电脑接口即OK,之后在    中点击搜索“设备管理...

qq_40013290的博客 881

【iOS/Swift】自定义操作符 prefix postfix infix

说明 操作符预定义 prefix infix postfix prefix: 运算符在运算值的前方; postfix:运算符在运算值的后方;infix:运算符在运算值之间 precedencegroup:定义运算符的其它属性 prefix operator ^ postfix operator ^- infix operator ^^ 代码示例 // 前置:返回2的n次方 prefix operator ^ prefix func ^ (vector: Double) -> Double {

u013248706的博客 1691

Win10 / Win11 启用 Hyper-V 虚拟机详细教程(图文+命令行全攻略)

摘要:本文详细介绍Windows10/11系统启用Hyper-V虚拟化平台的方法,包含专业版/企业版的图形界面和PowerShell命令行操作,以及家庭版通过脚本强制启用的特殊方案。内容涵盖版本支持对比、操作步骤图解、常见问题解答和性能优化建议,帮助开发者快速搭建虚拟化环境进行多系统测试。附微软官方文档参考链接和详细操作示意图。

ElioXu 7060

李大勇matlab密码,基于MatlabSimulink的太阳能热水系统仿真研究 沈超.doc

基于MatlabSimulink的太阳能热水系统仿真研究 沈超中国工程热物理学会 工程热力学与能源利用 编号:141090基于Matlab/Simulink的太阳能热水系统仿真研究沈 超1 1 余 鹏1 李洪欣1 魏新利2郑州大学土木工程学院,郑州 450001郑州大学化工与能源学院,郑州 45...

weixin_42298437的博客 1340

Swift - 操作符

与Objective-C不同,Swift支持重载操作符,它的最常用的使用方式可能就是定义一些简便的计算了,比如我们需要一个表示二维向量的数据结构: struct Vector2D { var x = 0.0 var y = 0.0 } 一个很简单需求是两个Vector2D相加 let v1 = Vector2D(x: 2.0, y: 3.0) let v2 = Vector2D(x: 1.0, y: 4.0) let v3 = Vector2D(x: v1.x + v2.x, y: v1.

HumorousGhost 608

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.1密码应用方案设计

密码应用方案设计

qq_40442137的博客 1470

swift_重载和自定义运算符

像这样定义一个结构体 struct Vector2D {     var x = 0.0     var y = 0.0 } 当 Vector2D 的两个变量相加时,我们需要这样做: let v1 = Vector2D(x: 2.0, y: 3.0) let v2 = Vector2D(x: 4.0, y: 5.0) var v3 = Vector2D(x: v1.x + v2.x

chaoyuan899的专栏 4019

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 148

甲基化生物信息学分析及批次效应校正全流程

本文系统阐述了DNA甲基化数据分析中的批次效应问题及解决方案。甲基化数据(β值和M值)对实验批次差异高度敏感,可能导致假阳性结果。文章详细介绍了批次效应检测方法(PCA可视化、BEclear定量评分)和校正流程,包括数据预处理、参数化(ComBat-met)与非参数化(BEclear)校正方法,并提供了完整的R代码实现。重点解决了β值有界分布与统计模型假设冲突的问题,为甲基化研究的可靠性提供技术保障。

huanghm88的专栏 107

Swift 4.0 高级-自定义操作符

在Swift语言中,常见的操作符有+、-、*、/、&gt;、&lt;、==、&amp;&amp;、||等等,如果不喜欢,你也可以定义自己喜欢的操作符。 操作符类型 中置运算符(infix operator) e.g. +、-、/、* 前置运算符(prefix operator) e.g. --、++ 后置运算符(postfix operator) e.g. --、++ 注意:在...

我只是一个攻城狮 2905

KEPServerEX 6 之 GE Ethernet 连接FANUC ROBOT机器人实战

GE Fanuc是GE公司控制系统部门的一部分,成立于1998年。其主要业务涵盖工业自动化、控制系统、PLC和组态软件等领域。其产品可用于包括自动化、过程自动化、国防、汽车制造、通讯、医疗和航空航天等各种工业领域2009 8月 GE和FANUC今天宣布两家公司已同意解除合资企业GE FANUC自动化公司。通过以上历史,GE Ethernet Driver 当下还支持对接FANUC ROBOT机器人 就不奇怪了。

-雲飛兄-博客 1791

Swift 中关于操作符的那些事儿

知道 ObjectMapper 的人大概都见过在使用 Mappable 定义的模型中 func mapping(map: Map) {} 中需要写很多 name &lt;- map["name"] 这样的代码。这里的 &lt;- 将模型中的属性跟数据中的 key 对应了起来。 Swift 提供的这种特性能够减少很多的代码量,也能极大的简化语法。在标准库或者是我们自己定义的一些类型中,有一些只是简...

weixin_34219944的博客 205

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

操作符重载

在Swift中,系统定义的操作符有时候对于自己定义的结构体或类的使用不是很方便,所以我们需要自定义操作符来简化操作。Swift中的操作符重载比较简单,只需要在结构体或类中定义并实现重载的方法即可,单目操作符传入一个参数、双目操作符传入两个参数。实例如下: // 定义一个结构体 struct p { var x: Int var y: Int //重载+操作符

麻豆_matou 424

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

swift学习笔记之运算符重载

/** * 今天我们来谈一谈Swift中的操作符重载,这一功能非常实用,但是也相当有风险。正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了。它可以令你的代码更加简洁,也可以让一个函数调用变得又臭又长。而对于那些没怎么读过你的代码的人来说,操作符的使用同时也会让代码的可读性大打折扣。谨慎引入,按需使用。比如在连接两个字串的时候你就可以通过重载加法来实现。甚至于你仅在屏幕上输入一个加号

滴水可以穿石 百炼才能成钢,谋全局而通一域 致广大而尽精微 684

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Swift操作符重载:编程语言的瑞士军刀

在Swift中,操作符重载指的是让已有的操作符(如+、-、*、/等)对自定义类型起作用。Swift支持重载大部分的Cocoa框架中使用的操作符,包括比较运算符和基本的算术运算符。除了重载已有的操作符,Swift还允许我们定义全新的操作符。自定义操作符可以是单个字符、多个字符或者包含特定字符的组合。// 使用。

2402_85761468的博客 716

再议Swift操作符重载

今天我们来谈一谈Swift中的操作 符重载,这一功能非常实用,但是也相当有风险。正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了。它可以令你的代码更加简洁,也可以让 一个函数调用变得又臭又长。而对于那些没怎么读过你的代码的人来说,操作符的使用同时也会让代码的可读性大打折扣。 谨 慎引入,按需使用。比如在连接两个字串的时候你就可以通过重载加法来实现。甚至于你仅在屏幕上输入一个...

weixin_33978016的博客 109

Swift之使用KeyPaths创建自定义查询函数

一、前言 作为一个相当严格,静态编译的语言,Swift 可能不会在语法自定义方面提供许多渠道,但这实际上确正好相反。通过如何在 Swift 中自定义操作符,Swift 中 KeyPaths 的能力,函数/结果构建器等功能,我们有很多机会为特定用例进行调整 Swift 的语法。 当然,无可争议的是,任何类型的语法定制都应小心谨慎地,因为如果不小心,非标准语法也可能很容易成为混乱的源泉。但是,在某些情况下,权衡可能是值得的,并且可以易于制作类似 DSL 这种可以帮助我们使代码更清晰的语法。 二、否定布尔值的

╰つ栺尖篴夢ゞ 3万+

JSONHelper源码解析:深入理解Swift操作符重载的实现原理

JSONHelper是一个功能强大的Swift库,专注于简化类型转换操作,其核心特色在于通过自定义操作符`<--`实现了简洁高效的类型转换机制。本文将深入解析JSONHelper源码中操作符重载的实现原理,帮助开发者理解如何通过操作符重载提升代码可读性和开发效率。 ## 操作符重载的基础定义 在Swift中,操作符重载允许我们为自定义类型或现有类型定义新的操作符行为。JSONHelper中最核

gitblog_00944的博客 891

编程语言自定义操作符:原理、实现与应用场景

操作符重载是编程语言中提升代码表达力的重要特性,它允许开发者通过函数绑定或编译器插件等方式扩展语言原生操作符。从编译器原理看,自定义操作符需要处理词法分析、语法优先级和类型检查等关键环节,最终转换为标准方法调用。这种技术在领域特定语言(DSL)构建和数学计算等场景中价值显著,比如Kotlin的中缀函数和Python的矩阵乘法操作符@。合理使用自定义操作符需要遵循语义透明、避免冲突等设计原则,同时要注意调试复杂性和性能优化。现代语言如Swift和Rust通过特性系统提供了更安全的操作符扩展机制,而在量子计算等

weixin_34026276的博客 320

Swift运算符重载

import Foundationclass Complex { var real = 0 var virtual = 0 init(real: Int,virtual: Int) { self.real = real; self.virtual = virtual } func show() -> Void {

qq_40691827的博客 284
上一篇: GPUImage源码解读(一)
下一篇: Swift中的let和var背后的编程模式
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值