在静态/类方法上使用`self`作为默认参数

时间:2018-12-20 04:27:23

标签: swift function methods

是否可以将self设置为静态方法的默认参数?例如

enum Foo {
    static func processSomething(forOwner owner: Any = self) -> Bar {
        ...
    }

    // or 
    static func processSomething(forOwner owner: Any = Caller.self) -> Bar {
        ...
    }
}

我找到了这个SO post,但是问题是关于实例方法的,我认为对于静态/类方法来说可能是可行的,因为可能有所不同。

这是为了简化代码,例如

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)
    }
}

编辑:我实际上只是出于好奇而问。我没有用例,并且可能不会在现实世界中使用它。

2 个答案:

答案 0 :(得分:2)

self作为实例的引用不适用于static函数,因此就该特定方式而言,问题的答案为“否”。但是,在为自己节省一些输入的情况下,并通过一个名为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)
    }
}

答案 1 :(得分:1)

不。对于静态函数,它不能使用“自我”。

我不明白您为什么需要它;您可以删除该参数,并根据需要调用self.processSomething或other.processSomething。也许您应该解释一下为什么您认为这对您的情况有用,并考虑是否有意义。