代码之家  ›  专栏  ›  技术社区  ›  Zonily Jame

将“self”用作静态/类方法的默认参数

  •  1
  • Zonily Jame  · 技术社区  · 6 年前

    有没有办法将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 回复  |  直到 6 年前
        1
  •  2
  •   par    6 年前

    self 因为引用实例对 static 功能,所以你的问题的答案是“不”,因为具体的方式。然而,在为自己保存一些类型的上下文中,通过遍历一个名为 triggerSomething() 哪里 自己

    这个答案纯粹是为了解决问题 怎样

    注意,我返回一个 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)
        }
    }
    
        2
  •  1
  •   Chris Shaw    6 年前

    不,对于一个静态函数来说,没有“self”可以使用。

    我不明白您为什么需要它;您可以删除参数并调用自我处理或者其他的什么视情况而定。也许你应该解释一下为什么你认为它对你的处境有用,并且想想它是否有意义。