重载相等运算符 (==) 来比较 String 和 Int

Overload Equality Operator (==) to compare String and Int

我正在体验协议并挑战自己编写一个代码片段来重载 == 运算符,以便在我将随机 String 与值 [=15] 进行比较时它 returns true =] 的 Int 值为 42。请不要通过简单地在 String 上返回 42 来质疑有用性,重点是在两种不同的类型上获得 Equality Operator 到 运行。

这是我尝试过的:

版本 1

import Foundation

protocol IntTransformable: Equatable {
    func toInt() -> Int
}

extension String: IntTransformable {
    func toInt() -> Int {
        return 42
    }
}

extension Int: IntTransformable {
    func toInt() -> Int {
        return self
    }
}

extension IntTransformable {
    static func == (lhs: Self, rhs: Self) -> Bool {
        return lhs.toInt() == rhs.toInt()
    }
}

// throws: Ambiguous reference to operator function '=='
if "42" == 42 {
    print("equal")
} else {
    print("unequal")
}

版本 2

import Foundation

protocol IntTransformable: Equatable {
    func toInt() -> Int
}

extension String: IntTransformable {
    func toInt() -> Int {
        return 42
    }
}

extension Int: IntTransformable {
    func toInt() -> Int {
        return self
    }
}

extension IntTransformable {
    // throws: Protocol 'IntTransformable' can only be used as a generic constraint because it has Self or associated type requirements
    static func == (lhs: IntTransformable, rhs: IntTransformable) -> Bool {
        return lhs.toInt() == rhs.toInt()
    }
}

// throws: Ambiguous reference to operator function '=='
if "42" == 42 {
    print("equal")
} else {
    print("unequal")
}

创建字符串扩展,例如

public string ToInt(这个int值) { // 一些转换代码

return ConvertedStringValue; }

或者您可以使用 uint.TryParse(字符串值,uint 输出) 如果转换成功,此语句将 return 为真。

你应该使用这两个函数:

func ==(lhs: String, rhs: @autoclosure ()->Int) -> Bool {
    guard let stringIntValue = Int(lhs) else { return false }
    return stringIntValue == rhs()
}

func ==(lhs: Int, rhs: String) -> Bool {
    guard let stringIntValue = Int(rhs) else { return false }
    return lhs == stringIntValue
}

但是如果你真的想在这里涉及 Protocols,你应该这样做:

extension IntTransformable {
    static func ==<T: IntTransformable>(lhs: Self, rhs: T) -> Bool {
        return lhs.toInt() == rhs.toInt()
    }
}

用法:

print( 42 == "42" )
print( "42" == 42 )

你想多了。没有理由在这里使用协议,你真的不能这样做,因为协议不是真正的类型。只需在顶层写下您的操作员:

func == (lhs: Int, rhs: String) -> Bool {
    return lhs == Int(rhs)
}
func == (lhs: String, rhs: Int) -> Bool {
    return Int(lhs) == rhs
}

测试:

print(5 == "5") // true