Используйте `self` в качестве параметра по умолчанию для статических методов / методов класса - PullRequest
0 голосов
/ 20 декабря 2018

Есть ли способ установить 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 голосов
/ 20 декабря 2018

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)
    }
}
0 голосов
/ 20 декабря 2018

Нет.Для статической функции нет «я», которое она может использовать.

Я не понимаю, зачем вам это нужно;Вы можете удалить параметр и вызвать self.processSomething или other.processSomething, в зависимости от ситуации.Может быть, вам следует объяснить, почему вы считаете это полезным для вашей ситуации, и подумайте, имеет ли это смысл.

...