Swift如何将一个方法应用于两个不同的类?
class Class1 {
func doSomething() {
self.doSomethingOnClass()
}
}
class Class2 {
func doSomething() {
self.doSomethingOnClass()
}
}
所以基本上我想做什么,而不是在我想要提取方法的每个类上实现相同的方法,然后让它将self视为Class1或Class2。我希望协议可以做但看起来如果类实现协议,那么我必须为每个类编写实现。 任何建议什么是实现这一目标的最佳做法?或者最好的方法是在类中实现它,即使它意味着重复的代码。
答案 0 :(得分:1)
基本上有两种方法可以做到这一点:继承或协议。 Swift绝对支持后者,如果只涉及一个函数,继承肯定是一个糟糕的选择。
以下是使用协议实现此目的的方法:
protocol CommonFunc: class {
func doSomethingOnClass()
}
extension CommonFunc {
func doSomethingOnClass() {
print(type(of: self))
}
}
class A: CommonFunc {
}
class B: CommonFunc {
}
A().doSomethingOnClass() // A
B().doSomethingOnClass() // B
答案 1 :(得分:0)
这可以使用协议和扩展来完成。这是使用Playgrounds的一个例子。如果您愿意,可以将此代码复制并粘贴到游乐场中以修改它,请注意扩展协议为类和结构提供了默认实现。
//: Playground - noun: a place where people can play
import UIKit
protocol ClassProtocol {
func classMethod()
}
extension ClassProtocol {
func classMethod() {
print("here i am")
}
}
class Class1: ClassProtocol { }
class Class2: ClassProtocol { }
struct Struct1: ClassProtocol { }
Class1().classMethod()
Class2().classMethod()
Struct1().classMethod()
输出:
here i am
here i am
here i am
这里发生了什么?该协议定义了使用协议在任何对象或结构中都需要方法classMethod
。然后,扩展提供该方法的默认实现。如有必要,您还可以覆盖此默认实现。
struct Struct2: ClassProtocol {
func classMethod() {
print("this does something different")
}
}
Struct2().classMethod()
输出:
this does something different