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

Swift 如何实现方法的自定义实现?,swift,closures,protocols,Swift,Closures,Protocols,不知什么原因,我画了一张空白纸。。如果我想从一个类中创建一组对象,但我希望每个实例都有自己的特定方法的唯一实现,那么我将如何做到这一点 例如: class MyClass { var name: String func doSomething() { // Each object would have custom implementation of this method, here. } } 我是否在初始化期间为每个对象提供自己的闭包,然

不知什么原因,我画了一张空白纸。。如果我想从一个类中创建一组对象,但我希望每个实例都有自己的特定方法的唯一实现,那么我将如何做到这一点

例如:

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

我是否在初始化期间为每个对象提供自己的闭包,然后在
doSomething()
方法中调用该闭包?我正试图找出正确或“迅速”的方法来做到这一点。我也在想一些关于协议的事情,但我似乎不知道该怎么做。

我认为有很多方法可以做到这一点

如果是基类+一些子类(例如
动物
,子类为
,等等),您可以执行以下操作:

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

protocol MyProtocol {
   func doSomething()
}
还提供一个默认实现,如果类未重写该方法,则会引发致命错误:

extension MyProtocol {
    func doSomething() {
        fatalError("You must override me")
    }
}
现在,由于默认实现,您的基类确认了协议。但它会在运行时抛出一个致命错误:

class MyClass: MyProtocol {
    // conformant
}
但是,子类将正确运行,只要它重写此函数:

class MyOtherClass: MyClass {

    func doSomething() {
        print("Doing it!")
    }
}
您还可以将致命错误移动到基类中,而不执行任何扩展实现

对于同一类的多个实例,该解决方案毫无意义。您可以使用非常简单的回调设计:

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()
它也可以是你正在寻找的,或者。取决于您的使用细节


我是否在初始化期间为每个对象提供自己的闭包,然后在doSomething()方法中调用该闭包

对。这是非常普遍的,而且非常迅速。令人难以置信的模仿例子:

struct S {
    let f:()->()
    func doYourThing() { f() }
}
let s = S { print("hello") }
let s2 = S { print("goodbye" )}
s.doYourThing() // hello
s2.doYourThing() // goodbye
给一个对象一个可设置的方法实例属性是非常非常简单和常见的。它不必在初始化期间提供-您可以稍后设置此属性,许多内置对象也是这样工作的


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

因此,每个对象基本上都有自己的子类?这取决于您所说的差异程度。。。e、 g.如果您有
-是;如果您有1000只
,那么将它们子类化当然没有意义。这就是为什么我说有很多选择。让我们假设我有1000只鸟,每只鸟都有自己的特定方法的自定义实现。其他一切都一样。更改答案以回答该问题。虽然很难说没有一个具体的问题在手-这么多的方式。谢谢你,你的答案的新部分(下半部分)是我正在寻找的。我只是不确定使用闭包是否是正确的方法,但似乎是这样!再次感谢。“我是否在初始化过程中为每个对象提供自己的闭包,然后在doSomething()方法中调用该闭包?”是的。不需要让该方法调用属性。结构S{let doYourThing:()->Void}