Update: это что касается приложения Mac, созданный с помощью шаблона приложения на основе документов в Xcode, и я переопределениеНе похоже, чтобы избежать сила разворачивает в Swift
override func readFromFileWrapper(fileWrapper: NSFileWrapper, ofType typeName: String, error outError: NSErrorPointer) -> Bool
I Я пытаюсь прочитать файл из NSFileWrapper, и кажется, что я не могу уйти от наличия хотя бы одного !
.
Во-первых, я попытался
if let rtfData = files["textFile.rtf"]?.regularFileContents,
newString = NSMutableAttributedString(data: rtfData, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}
Так что я получаю эту ошибку
Value of optional type 'NSData?' not unwrapped; did you mean to use '!' or '?'?
И я должен либо бросить regularFileContents as NSData!
или я должен заставить разворачивать его в инициализаторе в NSMutableAttributedString в (data: rtfData!
).
Затем я попытался
let rtfData = files["textFile.rtf"]?.regularFileContents
if (rtfData != nil) {
if let newString = NSMutableAttributedString(data: rtfData, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}
}
Какие результаты в
Cannot find an initializer for type 'NSMutableAttributedString' that accepts an argument list of type '(data: NSData??, options: [String : String], documentAttributes: nil, error: nil)'"
Так я должен изменить инициализатору сказать data: rtfData!!
, что я даже не уверен, что это означает .
Или, я могу наложить regularFileContents as NSData?
, а затем я могу использовать только один !
в инициализаторе.
Обновление: Вот еще одна вещь, которую я пробовал с момента публикации. Я понял, в NSData??
двойной ?
может быть из-за меня необязательно разворачивания NSFileWrapper (files["textFile.rtf"]?
), поэтому я попытался это:
if let rtfWrapper = files["textFile.rtf"],
rtfData = rtfWrapper.regularFileContents,
newString = NSMutableAttributedString(data: rtfData, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}
Компилятор еще хочет меня, чтобы заставить разворачивать NSData.
Я довольно тщательно смущен.
Что NSData??
, почему это «вдвойне» по желанию, почему это результат .regularFileContents
, и как я могу безопасно без !
-ную весь путь, получить NSData и передать его intializer в NSMutableAttributedString в ?
Очередное обновление
Я подумал, может быть постоянная files
может быть источником другого дополнительного упаковки:
let files = fileWrapper.fileWrappers
Но компилятор не позволит мне if let
его.Если я стараюсь, например,
if let files = fileWrapper.fileWrappers {
if let rtfFile = files["textFile.rtf"] {
if let rtfData = rtfFile.regularFileContents {
if let newString = NSMutableAttributedString(data: rtfData, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil, error: nil) {
text = newString
return true
}
}
}
}
Компилятор дает эту ошибку:
Bound value in a conditional binding must be of Optional type
О fileWrapper.fileWrappers
Переменная fileWrapper
является параметром метода, который
override func readFromFileWrapper(fileWrapper: NSFileWrapper, ofType typeName: String, error outError: NSErrorPointer) -> Bool
Попытался, что это тоже не сработало. В вашем фрагменте компилятор будет жаловаться на 'data: contents' и будет принимать только данные: содержимое!' – magiclantern
@kamera Нет, он не стал бы жаловаться на то, что' contents' является необязательным, потому что это не так (мы делаем необязательное связывание здесь, поэтому я разбил его на два назначения, поэтому каждая необязательная привязка может иметь место последовательно). Я просто тестировал его, и он работал нормально. – Rob
Не может быть, что моя константа 'files' является проблемой? Где вы получаете его в своем фрагменте? Проверьте обновление моего вопроса. – magiclantern