避免在没有类的情况下转向支持多态

时间:2017-09-25 23:17:34

标签: swift

我正在寻找一种方法来让一个函数接受一个特定的开关案例,或任何其他方式来实现我想要的,这是这样的:

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: ()
}

但这正是我想要避免的事情(也就是说,我正在寻找一种更优雅的方式)。

1 个答案:

答案 0 :(得分:3)

多态性适用于类,结构和枚举方法。具有独立功能的多态性没有意义。您定义的是重载函数。

如何将函数添加到协议定义中?这样,编译器将确保实现class的每个structenumCommonType都实现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"