【问题标题】:Extend Private class defined in an extension of class in Swift扩展在 Swift 类的扩展中定义的私有类
【发布时间】:2019-03-05 08:23:43
【问题描述】:

TL;DR

是否可以扩展私有的和在扩展中定义的类,即NewsParser


相关文件

swift2 - Extension of a nested type in Swift - Stack Overflow 谈到类似的情况,除了嵌套类类型不是私有的。


我有一堂课NewsPost:

class NewsPost {
  var title: String?
  var author: String?
  var mainContent: NSAttributedString?

  var data: Data? {
    didSet {
      let newsParser = NewsParser(delegate: self)
      newsParser.parse()
    }
  }

  // Init methods and other stuff...
}

还有一个NewsPost拥有的类NewsParser:(在另一个Swift文件中,但这似乎不是一个因素,因为SR-631

private extension NewsPost {
  private class NewsParser {
    weak var delegate: NewsPost?
    // Other properties for parsing...

    init(delegate: NewsPost) {
      self.delegate = delegate
    }

    func parse() {
      // parse the delegate.data and update properties in delegate (NewsPost instance)
    }

    // Other methods to be called for parsing...
  }
}

但似乎无法扩展NewsPost.NewsParser

以下尝试无效:

尝试 1

错误:由于“fileprivate”保护级别,“NewsParser”无法访问

private extension NewsPost { // Notice the "private" prefix
  class NewsParser {
    weak var delegate: NewsPost?
    //Other properties for parsing...

    init(delegate: NewsPost) {
      self.delegate = delegate
    }

    func parse() {
      // parse the delegate.data and update properties in delegate (NewsPost instance)
    }
    // Other methods to be called for parsing...
  }
}

NewsPost 定义中发生错误:

var data: Data? {
    didSet {
        let newsParser = NewsParser(delegate: self) // error happens here
        newsParser.parse()
    }
}

尝试 2

错误:“NewsParser”由于“私人”保护级别而无法访问

extension NewsPost { 
    private class NewsParser { // Notice the "private" prefix
        var delegate: NewsPost
        // Other properties for parsing...

        func parse() {
            // parse the delegate.data and update properties in delegate (NewsPost instance)
        }

        // Other methods to be called for parsing...
    }
}

extension NewsPost.NewsParser { // error happens here
// extensions here...
// many kinds of errors happen here
}

是否可以扩展私有和扩展中定义的类,即NewsParser

【问题讨论】:

    标签: swift


    【解决方案1】:

    我在操场上尝试了你的代码,它的工作原理就像一个魅力,一个私有类嵌套在一个私有扩展中:

    这样称呼:

    var str = "Hello, playground"
    let post = NewsPost()
    post.data = str.data(using: .utf8)
    

    您的主要问题是您可能在单独的文件中声明了您的 private 扩展名,而 private 表示 fileprivate 的扩展名。将您的扩展程序和您的 NewsPostclass 放在同一个文件中,您的错误应该会消失!

    如果您真的想扩展NewsParser,您必须将其设为内部。 扩展声明仅在文件范围内有效,因此如果您创建私有类,则无法扩展它。

    请注意,内部嵌套类在其目标之外是不可见的。因此,使用框架,您应该能够从您的 UI 代码中隐藏您的 NewsParser 类。

    【讨论】:

    • 抱歉,我现在只在您的回答中看到您的编辑。我现在将NewsParser 更改为internal
    • 您能否编辑您的回答帖子以突出显示最后两段?这将有助于这个问题的其他观众。
    • 答案没有改变,如果类是私有的,你根本无法扩展它。如果你想拥有一个私有扩展名(fileprivate),你必须在同一个文件中使用它
    • private extension { class NewsParser { ... } } extension { class NewsParser { ... } }有什么区别?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多