Swift - 一个方法2个类

时间:2018-05-22 17:31:04

标签: swift swift-protocols

Swift如何将一个方法应用于两个不同的类?

class Class1 {
      func doSomething() {
        self.doSomethingOnClass()
      }
}

   class Class2 {
      func doSomething() {
        self.doSomethingOnClass()
      }
}

所以基本上我想做什么,而不是在我想要提取方法的每个类上实现相同的方法,然后让它将self视为Class1或Class2。我希望协议可以做但看起来如果类实现协议,那么我必须为每个类编写实现。 任何建议什么是实现这一目标的最佳做法?或者最好的方法是在类中实现它,即使它意味着重复的代码。

2 个答案:

答案 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