如何将方法隐藏在Swift中(因此仍然可用)

  • 本文关键字:方法 隐藏 Swift swift xcode
  • 更新时间 :
  • 英文 :


是否可以隐藏一个swift方法(因此它不会出现在xcode autocompletion和所有其他位置中),而无需声明 private

这里的目标是使该方法"未列出"(即仅在用户知道确切名称的情况下可用)。

没有任何属性可以控制IDE的自动完成。通常,您将使用_前缀此类方法,以清楚地表明它不是用于一般用途,而是将所有此类方法分组在一起。

即使存在这样的属性(将来可能会有一个属性),它绝对不会以任何有意义的方式隐藏该方法(因为它绝对会出现在生成的标头中)。因此,这里唯一的目的是通过解开自动完成列表来使其在呼叫者上更加方便,而_做得很好。


只是为了完整,有一种方法可以实现这一目标,但是您不想走这条路IMO。如果这是NSOBJECT子类,则可以使用动态调度。(在Pure Swift中没有真正等同的等效。)您真的不想这样做,它会产生警告,但这是可能的,并且这些方法不会在自动完整中显示,因为它们在技术上不可见。

class C: NSObject {
    @objc private func hidden() {
        print("Hidden")
    }
    @objc private func hiddenReturn() -> String {
        return "hidden"
    }
}
let c = C()
c.perform(Selector("hidden"))
let result = c.perform(Selector("hiddenReturn"))?.takeUnretainedValue() as! String

好吧,现在我有很多奇怪的答案。您仍然不想这样做,但是以下技术实际上对某些事情很有用。您可以将指针传递给方法,并从不允许您直接访问的地方拨打它们。因此,假设您有一些"朋友"对象,希望特殊访问某些私人方法。然后,您可以作为创建的一部分返回对该方法的引用。然后,朋友将是唯一可以访问特殊方法的对象(尽管朋友可以将引用传递给其他对象,然后他们也可以访问)。例如:

class C {
    private func hidden() {
        print("hidden")
    }
    fileprivate class func create() -> (C, () -> Void) {
        let c = C()
        return (c, c.hidden)    // Return a reference to the private method
    }
    private init() {} // No creating us outside of create
}
class Friend {
    let c: C
    private let cHidden: () -> Void
    init() {
        (c, cHidden) = C.create()
        cHidden()   // Calling this function is the same as calling c.hidden()
    }
}
Friend()

最新更新