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