gpt4 book ai didi

swift - 重载相等运算符 (==) 来比较 String 和 Int

转载 作者:行者123 更新时间:2023-11-28 13:27:57 25 4
gpt4 key购买 nike

我正在体验协议(protocol)并挑战自己编写一个代码片段来重载 == 运算符,以便在我比较随机 String 时它返回 true 的值为 "42"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")
}

最佳答案

你应该使用这两个函数:

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 )

关于swift - 重载相等运算符 (==) 来比较 String 和 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58032397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com