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

时间:2019-09-20 16:50:55

标签: swift protocols equality

我正在尝试使用协议,并挑战自己编写一个使==运算符重载的代码段,以便在我将随机returns true与值String进行比较时将其"42"重载。其值为Int的{​​{1}}。请不要仅仅通过在42上返回42来质疑其有用性,主要是让String在两种不同的类型上运行。

这是我尝试过的:

版本1

Equality Operator

版本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 {
    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")
}

3 个答案:

答案 0 :(得分:3)

您应该使用以下两个功能:

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
}

但是,如果您真的想在这里涉及Protocol,则应该这样做:

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

用法:

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

答案 1 :(得分:1)

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

    base.OnCreate(savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App());


Unhandled Exception:

System.TypeLoadException: Could not load type of field 'Xamarin.Forms.Platform.Android.RendererPool:_freeRenderers' (0) due to: Could not resolve type with token 01000275 from typeref (expected class 'System.Collections.Generic.Stack`1' in assembly 'mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e') assembly:mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e type:System.Collections.Generic.Stack`1 member:(null) occurred

测试:

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

答案 2 :(得分:-3)

创建一个字符串扩展名,例如

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

返回ConvertedStringValue; }

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