gpt4 book ai didi

swift - swift中使用POP创建通用add函数()

转载 作者:行者123 更新时间:2023-11-30 10:03:49 25 4
gpt4 key购买 nike

更新:这只是为了学习 POP。我知道我们可以使用 <+> 运算符,但我想知道我错过了什么

我正在尝试创建一个快速通用函数来添加两个元素:- 如果元素为数字,则只需添加它们即可。- 如果元素是字符串,则将它们连接起来。

这是我的代码:

protocol NumericType {
func +(lhs: Self, rhs: Self) -> Self
}

extension Double : NumericType {}
extension Float : NumericType {}
extension Int : NumericType {}

protocol Addable {
func addGenerically<T>(element1: T, element2: T) -> T
}

extension Addable where Self:NumericType {
func addGenerically<T:NumericType>(element1: T, element2: T) -> T {
return (element1) + (element2)
}
}
// This throws error: inheritance from non protocol, non class type strings
extension Addable where Self:String {
func addGenerically<T:String>(element1: T, element2: T) -> T {
return (element1) + (element2)
}
}


class MyVC: UIViewController{

override func viewDidLoad() {
super.viewDidLoad()

let n1 = Double(3.4)
let n2 = Double(3.3)
let n3 = Addable.addGenerically(n1, element2: n2)
}

有什么想法如何完成这个并使用它吗?

最佳答案

这里的问题几乎就是错误所说的——你不能从非协议(protocol)或非类类型继承。

String 在 Swift 中被实现为 struct,并且结构没有继承。您无法创建 String 的“子结构”。相反,使用协议(protocol)来定义通用功能并提供层次结构。

因此,您需要使用协议(protocol)来约束扩展,就像您对 NumberType 协议(protocol)所做的那样。例如:

protocol AddableString {
func +(lhs: Self, rhs: Self) -> Self
}

extension String : AddableString {}

extension Addable where Self:AddableString {
func addGenerically<T:AddableString>(element1: T, element2: T) -> T {
return (element1) + (element2)
}
}

但是,这是相当冗长的,我什至不确定你将如何实现这个函数 - 因为你必须在现有值上使用它,而不是在添加。你根本不能像这样使用它:

Addable.addGenerically(n1, element2: n2)

由于 Addable 不是具体类型,因此您无法对其调用静态函数。

我建议通过将您的协议(protocol)合并到单个Addable 协议(protocol)中来显着简化您的代码。这将允许您定义要添加的类型,以及可以在 addGenerically 函数中使用的类型。例如:

protocol Addable {
func +(lhs: Self, rhs: Self) -> Self
}

extension Double : Addable {}
extension Float : Addable {}
extension Int : Addable {}
extension String : Addable {}

func addGenerically<T:Addable>(lhs:T, rhs:T) -> T {
return lhs + rhs
}

...

let n1 = 3.4
let n2 = 3.3

let n3 = addGenerically(n1, rhs: n2)

虽然我通常不希望使用新的全局函数污染全局命名空间 - 但您应该考虑让该函数采用单个 Self 参数,而不是在 Addable 的扩展中>,允许您通过调用另一个 Addable 上的方法来添加给定的 Addable(尽管这会删除泛型,您可能不希望在演示中使用它):

protocol Addable {
func +(lhs: Self, rhs: Self) -> Self
func addGenericallyWith(rhs: Self) -> Self
}

extension Double : Addable {}
extension Float : Addable {}
extension Int : Addable {}
extension String : Addable {}

extension Addable {
func addGenericallyWith(rhs:Self) -> Self {
return self + rhs
}
}

...

let n1 = 3.4
let n2 = 3.3

let n3 = n1.addGenericallyWith(n2)

尽管请注意,我们在这里所实现的只是重新实现 + 运算符! Swift 已经可以根据您使用的类型来推断要调用哪个 + 运算符实现 - 因此您无需创建自己的 addGenerically 函数。

关于swift - swift中使用POP创建通用add函数(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37172494/

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