重载相等运算符 (==) 来比较 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
}
但是如果你真的想在这里涉及 Protocol
s,你应该这样做:
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
我正在体验协议并挑战自己编写一个代码片段来重载 ==
运算符,以便在我将随机 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
}
但是如果你真的想在这里涉及 Protocol
s,你应该这样做:
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