Swift 重载相等运算符(=)以比较字符串和Int

Swift 重载相等运算符(=)以比较字符串和Int,swift,protocols,equality,Swift,Protocols,Equality,我正在体验协议,并要求自己编写一个代码段,使=运算符重载,以便在我将随机字符串与值“42”与值为的Int进行比较时,它返回true。请不要通过简单地在字符串上返回42来质疑它的有用性,要点是让相等运算符在两种不同的类型上运行 以下是我尝试过的: 版本1 版本2 创建一个字符串扩展名,如 公共字符串ToInt(此int值) { //一些转换码 返回ConvertedStringValue; } 也可以使用uint.TryParse(字符串值,out uint输出) 如果转换成功,此语句将返回tru

我正在体验协议,并要求自己编写一个代码段,使
=
运算符重载,以便在我将随机
字符串
与值
“42”
与值
Int
进行比较时,它
返回true
。请不要通过简单地在
字符串上返回
42
来质疑它的有用性,要点是让
相等运算符在两种不同的类型上运行

以下是我尝试过的:

版本1 版本2
创建一个字符串扩展名,如

公共字符串ToInt(此int值) { //一些转换码

返回ConvertedStringValue; }

也可以使用uint.TryParse(字符串值,out uint输出)
如果转换成功,此语句将返回true。

您应该使用以下两个函数:

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
}
但是,如果您真的想在这里加入
协议
s,您应该这样做:

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

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

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

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

您可以让您的协议像
static func==(lhs:Self,rhs:Self)->Bool{return lhs.toInt()==rhs.toInt()}
一样工作,在
字符串
Int
上使用运算符仍会导致相同的错误。您不能使用协议来执行此操作,因为协议不是真正的类型。@DávidPásztor感谢代码改进提示。@matt如果我不能使用协议,我能做什么呢?顺便说一句,如果您想为类型
T
引入不同的相等概念,我建议您制作一个
struct
,它包装了
T
,并通过实现相等的新定义来符合equalable。在现有类型上定义
=
通常会导致这种歧义/混乱在第二个示例中,我猜您的意思是
返回lhs.toInt()==rhs.toInt()
我认为该协议的目的是要进行多极比较。例如,Double、Float、Int32、Char等。在这种情况下,拥有第一个解决方案会有很大不同functions@Vollan<代码> toint()/代码>将其限制为<代码> int >代码>,然后他应该考虑使用函数的重载,而不是使用这个严格的协议。协议版本对我不适用,为什么在两个函数中使用
自动关闭
?@mojtabahoseseini知道了,谢谢伙计!我刚刚读了另一篇关于它的文章,它变得更清晰了。我没有注意到参数本身可以作为函数/方法/传递。谢谢你的帮助。在这里学到了很多。我也尝试在全局级别上定义运算符,但我想你说的是对的,你说我想得太多了。@ChrisGraf如果这有什么不同的话,你也可以将它们声明为Int的扩展运算符没有命名空间<代码>=
=
,无论是在结构中定义还是在顶层中定义。这真的没有什么意义difference@Alexander我试图摆脱的是OP代码中的自我/可转换的可爱。朴素和简单往往是最好的。“说出你的意思”是一个编程koan。@matt我的评论是针对Chris“试图在全局级别上绕开定义运算符”的回应
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