Неоднозначная ссылка на члена close () - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь создать приложение, которое позволит пользователю переключаться между следующими / предыдущими файлами текстовых документов в папке, так как приложения для просмотра фотографий часто разрешают просмотр следующего / предыдущего изображения. Мне кажется, что наиболее эффективный способ сделать это - заменить документ в текущем открытом окне. Отредактированный ответ на мой предыдущий вопрос по теме c предполагает, что это действительно возможно. Я хочу иметь возможность использовать архитектуру документа для открытия и сохранения; Я не хочу обобщать структуру, я пытаюсь сделать ее простой. Я пытался использовать код, рекомендованный в предыдущем вопросе, следующим образом:

let prevDocument = windowController.document
let newDocument = Document(contentsOf: newURL, ofType: myDocumentType) // add do-catch
NSDocumentController.shared.addDocument(newDocument);
newDocument.addWindowController(windowController)
prevDocument.close()

Но когда я делаю это, команда prevDocument.close () выдает мне странную ошибку «Неоднозначная ссылка на member» close () «». Другой поток сообщает мне, что «ошибка такого рода появляется, когда существует более одной переменной / метода с одинаковым именем». Хорошо, но какие, и как это исправить? Под ошибкой «неоднозначная ссылка» я получаю два сообщения: «Найден этот кандидат (Foundation.Stream)» и «Найден этот кандидат (AppKit.NSBezierPath)». Краткий взгляд на документы для Foundation.Stream и NSBezierPath показывает, что я пытаюсь работать с Foundation.Stream, а не с NSBezierPath, но я понятия не имею, как сказать системе, что (или почему NSBezierPath будет участвовать в первое место).

1 Ответ

1 голос
/ 07 января 2020

Свойство document NSWindowController имеет тип AnyObject?, поэтому нет метода close, и компилятор пытается выяснить, к какому типу объекта это может относиться, так что он может иметь close method.

При просмотре документации по свойству document в Xcode (нажатие ctrl-cmd) отображается комментарий о том, что свойство document обычно имеет тип NSDocument, который имеет close метод. Typecasting стоит попробовать:

guard let prevDocument = windowController.document as? NSDocument else {
    // ...
}

// Rest of your code

В качестве альтернативы, если вы можете гарантировать, что ваше приложение будет одновременно управлять только одним документом:

guard let previousDocument = NSDocumentController.shared.documents.first else {
    // ...
    return
}

// Rest of your code
...