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

本文介绍了Swift中操作符的重载和自定义,以矩形结构体为例,展示了如何声明结构体、重载系统操作符以及自定义新的操作符。文章还探讨了`precedencegroup`的定义和操作符的结合律、优先级。通过实例,阐述了如何在实际代码中使用自定义操作符。

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

操作符的重载和自定义在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
//      r2r3 相交的区域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
内容概要:本文研究了基于DPWMA调制与正负序分离的ANPC三电平并网逆变器前馈控制策略,旨在解决传统三电平逆变器存在的谐波含量高、电网不平衡工况适应性差及动态响应速度不足等问题。通过采用有源中点箝位(ANPC)三电平逆变器拓扑,结合双极性倍频脉宽调制(DPWMA)、正负序分离锁相技术和电网电压前馈控制,构建了一套一体化的高性能并网控制体系。该体系不仅优化了逆变器的开关动作机制,改善了输出电压电流的谐波特性,而且通过精确的相位同步和扰动补偿,显著提高了系统的动态响应能力和抗扰性能。仿真结果显示,所提出的控制策略能有效降低并网谐波含量,提升锁相精度与系统动态稳定性,确保在复杂电网工况下的高质量稳定并网。 适合人群:具备一定电力电子基础知识和仿真技能的研发人员,尤其是从事新能源发电、储能系统、柔性输电等领域研究的专业人士。 使用场景及目标:①研究和开发高性能并网逆变器,特别是针对大功率、高电能质量要求的应用场景;②探索如何通过先进的调制和控制策略来提高并网逆变器对电网扰动的适应性和响应速度;③为相关领域的学术研究和技术开发提供理论依据和实践指导。 阅读建议:建议读者结合实际的仿真软件(如MATLAB/Simulink)进行实践操作,以便更好地理解和掌握文中提到的各种控制策略的具体实现方法。同时,鼓励读者关注最新的研究成果和发展趋势,不断深化对该领域的认识。
摘要 在全球生态环境问题日益严峻、公众环保参与意愿持续提升的背景下,传统环保志愿者招募与管理模式存在信息传播零散、供需对接不畅、管理效率低下等痛点,制约了环保公益事业的规模化发展。为解决上述问题,响应生态保护数字化发展需求,本课题设计实现“守望自然”环保志愿者招募与管理网站,通过数字化手段打通环保组织与志愿者的服务链路,对推动环保公益规范化、高效化发展具有重要的现实意义与实践价值。 该网站采用B/S架构与前后端分离模式开发,前端基于Vue架构建组件化响应式界面;后端以Java为开发语言,采用Spring Boot框架搭建应用,搭配MyBatis作为持久层框架,数据库选用MySQL并遵循第三范式设计7个以上核心数据表。系统涵盖用户与管理员两大核心角色,实现了闭环式环保志愿服务功能:用户端支持注册登录、个人信息管理、活动查询报名、环保知识学习、社区互动、问题反馈及客服咨询等功能,满足用户全流程参与需求;管理员端具备用户管理、用户审核、招募与活动信息发布管理、环保知识内容管理、问题反馈处理、证书模板管理、多维度数据可视化分析及社区内容监管等功能,全面支撑环保组织运营管理。开发过程中集成了Token身份认证、MD5密码加密、ECharts数据可视化等关键技术,融入活动智能推荐、数据驱动决策等创新设计,确保系统功能完备性与实用性。 经功能测试、性能测试及安全测试验证,系统运行稳定可靠,具有良好的易用性、安全性和可扩展性,能够高效满足环保组织的用户招募管理需求与用户的多元化参与需求,有效降低环保组织运营成本,提升用户参与体验,为环保理念传播与公益事业发展提供有力的数字化支撑。 关键词:环保志愿者;招募管理系统;Spring Boot;Vue;数据可视化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值