如何实现方法的自定义实现?

How to implement custom implementation of method?

出于某种原因我画了一个空白..如果我想从 class 中制作一堆对象,但我希望每个实例都有自己独特的特定方法实现,如何我会这样做吗?

例如:

class MyClass {
    var name: String
    
    func doSomething() { 
        // Each object would have custom implementation of this method, here.
    }
}

我是否在初始化期间为每个对象提供自己的闭包,然后在 doSomething() 方法中调用该闭包?我试图找出正确或“迅速”的方法来做到这一点。我也在考虑一些带有协议的东西,但我似乎无法弄清楚如何去做。

我认为有很多方法可以做到。

如果是 Base class + 一些子classes(例如 Animal,subclassed by DogCat 等),您可以这样做:

首先定义一个协议是个好主意:

protocol MyProtocol {
   func doSomething()
}

还提供一个默认实现,如果 class 没有覆盖该方法,它会抛出一个致命错误:

extension MyProtocol {
    func doSomething() {
        fatalError("You must override me")
    }
}

现在你的基地 class 由于默认实施确认协议。但是它会在运行时间抛出致命错误:

class MyClass: MyProtocol {
    // conformant
}

子 class 但是,只要它覆盖此函数,就会 运行 正确:

class MyOtherClass: MyClass {

    func doSomething() {
        print("Doing it!")
    }
}

您也可以将致命错误移至基础 class,而不执行任何扩展实现。

如果有许多相同的实例 Class,则该解决方案毫无意义。您可以使用非常简单的回调设计:

typealias MyDelegate = () -> Void

class MyClass {

    var delegate: MyDelegate?

    func doSomething() {
        delegate?()
    }
}

let x = MyClass()
x.delegate = {
    print("do it!")
}
x.doSomething()

// Or you can use a defined function
func doIt() {
    print("also doing it")
}
x.delegate = doIt
x.doSomething()

也可能是你在找Strategy pattern, or Template pattern。取决于您的使用详情。

Do I provide each object with its own closure during initialization, and then call that closure in the doSomething() method

是的。这是非常普遍的,而且非常 Swifty。令人难以置信的简约示例:

struct S {
    let f:()->()
    func doYourThing() { f() }
}
let s = S { print("hello") }
let s2 = S { print("goodbye" )}
s.doYourThing() // hello
s2.doYourThing() // goodbye

给一个对象一个可设置的方法实例属性是非常非常简单和常见的。它 没有 在初始化期间提供 - 您可以稍后设置此 属性,并且许多内置对象也以这种方式工作。

毕竟,这就是您使用 dataTask(with:completionHandler:) 创建数据任务时所做的全部工作。您正在创建一个数据任务并将其存储的函数交给它,它会在执行实际网络时调用该函数。