我正在寻找一种方法来让一个函数接受一个特定的开关案例,或任何其他方式来实现我想要的,这是这样的:
protocol CommonType {}
struct A: CommonType {}
struct B: CommonType {}
func f(_ a: A) {
print("A")
}
func f(_ b: B) {
print("B")
}
let x: CommonType = A()
f(x) // expect to print "A"
所以基本上我需要一种基于我的结构类型有条件地调用f
的方法。
显然我可以这样做:
switch x {
case let y as A:
f(y)
case let y as B:
f(y)
default: ()
}
但这正是我想要避免的事情(也就是说,我正在寻找一种更优雅的方式)。
答案 0 :(得分:3)
多态性适用于类,结构和枚举方法。具有独立功能的多态性没有意义。您定义的是重载函数。
如何将函数添加到协议定义中?这样,编译器将确保实现class
的每个struct
,enum
或CommonType
都实现func f()
:
protocol CommonType {
func f()
}
struct A: CommonType {
func f() {
print("A")
}
}
struct B: CommonType {
func f() {
print("B")
}
}
let x: CommonType = A()
x.f() // prints "A"
不,我需要它作为一个函数,因为我将使用多个 完全不相关的地方,所以我的协议会膨胀。 另外,我更喜欢FP而不是OO。
我不明白对膨胀协议的关注。通过将该函数添加到协议定义中,可以确保每个实现协议的结构都能正确实现该函数。编译器将强制执行它。如果你坚持使用函数,你可以写一个包装器:
func f(_ x: CommonType) {
x.f()
}
f(x) // prints "A"