Расширение частного класса, определенного в расширении класса в Swift - PullRequest
0 голосов
/ 29 сентября 2018

TL; DR

Можно ли расширить частный класс и класс, определенный в расширении, например NewsParser?


Соответствующие документы

swift2 - Расширение вложенного типа в Swift - Переполнение стека говорит о похожей ситуации, за исключением того, что тип вложенного класса не является закрытым.


У меня есть класс 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

Ошибка: «NewsParser» недоступен из-за уровня защиты «fileprivate»

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?

1 Ответ

0 голосов
/ 29 сентября 2018

Я попробовал ваш код на детской площадке, и он работал как шарм с частным классом, вложенным в личное расширение:

Вызывается так:

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

enter image description here

Ваша основная проблема заключается в том, что вы, вероятно, объявили ваше расширение private в отдельном файле, а private означает fileprivate для расширения,Поместите свое расширение и класс NewsPost в один и тот же файл, и ваша ошибка должна исчезнуть!

Если вы действительно хотите расширить NewsParser, вам нужно сделать его внутренним.Объявление расширения допустимо только в области видимости файла, поэтому, если вы создаете закрытый класс, у вас нет возможности его расширить.

Обратите внимание, что внутренний вложенный класс не будет виден за пределами своей цели.Таким образом, используя Frameworks, вы сможете скрыть свой класс NewsParser от своего кода пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...