Swift 将“self”用作静态/类方法的默认参数
有没有办法将self设置为静态方法的默认参数?比如说Swift 将“self”用作静态/类方法的默认参数,swift,function,methods,Swift,Function,Methods,有没有办法将self设置为静态方法的默认参数?比如说 enum Foo { static func processSomething(forOwner owner: Any = self) -> Bar { ... } // or static func processSomething(forOwner owner: Any = Caller.self) -> Bar { ... } } class Ba
enum Foo {
static func processSomething(forOwner owner: Any = self) -> Bar {
...
}
// or
static func processSomething(forOwner owner: Any = Caller.self) -> Bar {
...
}
}
class Baz {
var bar: Bar?
func triggerSomething() {
// automatically infer self instead of me explicitly placing it here
// so the code will be this
self.bar = Foo.processSomething()
// instead of this
self.bar = Foo.processSomething(forOwner: self)
}
}
我发现了这一点,但问题是关于实例方法的,我认为对于静态/类方法可能是可行的,因为它们可能不同
例如,我可以缩短这样的代码
enum Foo {
static func processSomething(forOwner owner: Any = self) -> Bar {
...
}
// or
static func processSomething(forOwner owner: Any = Caller.self) -> Bar {
...
}
}
class Baz {
var bar: Bar?
func triggerSomething() {
// automatically infer self instead of me explicitly placing it here
// so the code will be this
self.bar = Foo.processSomething()
// instead of this
self.bar = Foo.processSomething(forOwner: self)
}
}
编辑:实际上我只是出于好奇而问。我没有这方面的用例,可能不会在现实世界中使用它。没有。对于静态函数,它没有可以使用的“self”
我不明白你为什么需要它;您可以删除该参数并根据需要调用self.processSomething或other.processSomething。也许你应该解释为什么你认为它对你的情况有用,并思考它是否有意义。
self
作为一个实例的引用,对静态功能来说是不可用的,所以你的问题的答案是“否”。然而,在保存一些键入的上下文中,通过使用名为triggerSomething()
的实例方法(其中self
可用),您可以完成您希望完成的任务
这个答案纯粹是为了说明你可以如何做。我应该说,我真的认为它没有太多的实用性,如果你发现自己需要这样一种模式,你可能最好在设计上投入更多的时间。但不管怎样,这就是它的样子
请注意,为了简单起见,我将返回一个Int
,其中您的问题中有Bar
protocol Processable { }
class Foo: Processable {
static func processSomething(forOwner owner: Processable) -> Int {
return 1
}
func triggerSomething(forOwner owner: Processable? = nil) -> Int {
return Foo.processSomething(forOwner: owner ?? self)
}
}
当类型为Any
时,为参数owner
设置默认值是毫无用处的。不管怎样,您始终必须将该所有者强制转换为此方法中的已知类型。我只是好奇是否可以使用self作为默认参数。我投票将这个问题作为离题来结束,因为OP同意实际上做他所问的事情没有什么意义,而且他没有提供一个有意义的用例。我完全赞成出于好奇而提出问题,但是询问毫无意义的努力会消耗可以用来帮助有实际问题的人的资源。好吧,所以答案仍然是否定的,而且如果没有参数,您不会保存很多代码。我仍然怀疑有一个更优雅的答案来回答你想要做的事情,但是我不能不知道更多。例如,您试图编写的方法是否可能根本不在枚举上,而是在所有潜在调用方都应该扩展的基类/协议上(这样您就不依赖于任何类型的方法)?我只是出于好奇而问。我也没有这方面的用例,可能不会在真实场景中使用它,因为它可能会给与我一起工作的其他开发人员带来困惑。我更新了我的问题,关于我为什么问这个问题的看法。但是你是对的,它实际上没有太多的实用性。如果可能的话,使用我上面添加的代码,如果使用不当,可能会产生巨大的影响。崩溃和错误肯定会出现。