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