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}