Swift之自定义运算符

1.swift允许中自定义运算符:

前置运算符(prefix)
中间运算符(infix)
后置运算符(postfix)

2.自定义运算符仅能包含这些字符:

/ = - + * % < >!& | ^。~

3.例子

import Foundation

//前置运算符
prefix operator !*
//中间运算符
infix operator +++
//后置运算符
postfix operator *!

class JSCoperator {
    
    var name: String?
    var idCard: String?
    var age: Int = 0
    
    
    //自定义==
    static func == (lhs: JSCoperator, rhs: JSCoperator) -> Bool {
        return lhs.idCard == rhs.idCard
    }
    //前置运算符
    static prefix func !* (lhs: JSCoperator) -> Int {
        return lhs.age * 2
    }
    //中间运算符
    static func +++ (lhs: JSCoperator, rhs: JSCoperator) -> Int {
        return lhs.age + rhs.age
    }
    //后置运算符
    static postfix func *! (rhs: JSCoperator) -> Int {
        return rhs.age * 3
    }
    
    
    
}

4.0我们也可以让类遵循EquaTable协议,这样就必须实现EquaTable的自定义“==”方法

public protocol Equatable {

    /// Returns a Boolean value indicating whether two values are equal.
    ///
    /// Equality is the inverse of inequality. For any values `a` and `b`,
    /// `a == b` implies that `a != b` is `false`.
    ///
    /// - Parameters:
    ///   - lhs: A value to compare.
    ///   - rhs: Another value to compare.
    static func == (lhs: Self, rhs: Self) -> Bool
}

5.0当然我们也可以在类型之外自定义运算符,这样我们就可以作为一个工具类来使用了

import Foundation

//前置运算符
prefix operator !*
//中间运算符
infix operator +++
//后置运算符
postfix operator *!

class JSCoperator {
    
    var name: String?
    var idCard: String?
    var age: Int = 0
    
    
    //自定义==
    static func == (lhs: JSCoperator, rhs: JSCoperator) -> Bool {
        return lhs.idCard == rhs.idCard
    }
    //前置运算符
    static prefix func !* (lhs: JSCoperator) -> Int {
        return lhs.age * 2
    }
    //中间运算符
    static func +++ (lhs: JSCoperator, rhs: JSCoperator) -> Int {
        return lhs.age + rhs.age
    }
    //后置运算符
    static postfix func *! (rhs: JSCoperator) -> Int {
        return rhs.age * 3
    }
}

func == (lhs: String, rhs: JSCoperator) -> Bool {
    if lhs == rhs.name{
        return true
    }
    return false
}


prefix operator ~=
prefix func ~= (lhs:Int) -> Int {
    return lhs * 3
}
postfix operator =~
postfix func =~ (rhs: JSCoperator) -> Int {
    return rhs.age * 10
}

最后我们验证一下结果:

        let c1 = JSCoperator()
        c1.name = "jsc"
        c1.idCard = "123456"
        
        let c2 = JSCoperator()
        c2.name = "jy"
        c2.idCard = "123456"
        
        print(c1 == c2)
        
        
        c1.age = 5
        c2.age = 6
        print(!*c1)
        print(c1 +++ c2)
        print(c1*!)
        
        
        let str = "jsc"
        print(str == c1)
        
        let i = 6
        print(~=i)
        print(c1=~)

打印结果:

true
10
11
15
true
18
50

你可能感兴趣的:(Swift之自定义运算符)