gpt4 book ai didi

swift 3 : Any way to declare a static class function to restrict closure type to Self?

转载 作者:行者123 更新时间:2023-11-30 12:37:44 25 4
gpt4 key购买 nike

我正在尝试在泛型类上创建一个静态方法,该方法接受闭包作为参数并创建该类的实例并将闭包传递给它。问题是我想对其进行子类化并确保闭包符合我使用的任何子类。

我知道您可以使用“Self”作为静态方法的返回类型,但是当我尝试在方法头中使用它时,出现以下错误:

"'Self' is only available in a protocol or as the result of a method in a class"

我想做这样的事情:

class GenericClass: NSObject {
required override init() {
super.init()
}

static func createAndExecuteAsync(block: (Self) -> Void) {
DispatchQueue.global().async {
let instance = self.init()
block(instance)
}
}
}

class OtherClass: GenericClass {
// ...
}

在其他地方...

OtherClass.createAndExecuteAsync { (instance: OtherClass) in
// Do stuff to instance
}

更新:

感谢 Hamish 在 this post 中的解决方案,我更接近解决方案了。如果我首先为我的泛型类创建一个协议(protocol),我可以以所需的方式使用 Self。然而,这迫使我将 OtherClass 定为最终的,这对于我的情况来说是不可取的。

如果没有将 OtherClass 设置为最终的,我会收到以下错误:

Protocol 'GenericClass' requirement 'createAndExecuteAsync(block:)' cannot be satisfied by a non-final class ('OtherClass') because it uses 'Self' in a non-parameter, non-result type position.

它看起来像这样:

protocol GenericClass {
init()
static func createAndExecuteAsync(block: @escaping (Self) -> Void)
}

extension GenericClass {
static func createAndExecuteAsync(block: @escaping (Self) -> Void) {
DispatchQueue.global().async {
let instance = self.init()
block(instance)
}
}
}

final class OtherClass : GenericClass {
var myProperty = 1

required init() { }
}

// Somewhere else...
OtherClass.createAndExecuteAsync { (instance) in
instance.myProperty = 2
}

最佳答案

也许您可以使用使用语法略有不同的全局通用函数。

例如:

 func createAndExecuteAsync<T:GenericClass>(_ objectType:T.Type, _ block:@escaping (T) -> Void)
{
DispatchQueue.global().async
{
let instance = T.init()
block(instance)
}
}


createAndExecuteAsync(OtherClass.self){ $0.myProperty = 2 }

// instead of OtherClass.createAndExecuteAsync{ $0.myProperty = 2 }

关于 swift 3 : Any way to declare a static class function to restrict closure type to Self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42660874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com