Почему UIPasteboard.general.string? .Append («другой») создает sh, если UIPasteboard.general.string возвращает ноль? - PullRequest
1 голос
/ 08 февраля 2020

Cra sh отчет:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIConcretePasteboard setString:]: Argument is not an object of type NSString [(null)]'

Трассировка стека:

0   CoreFoundation     0x00007fff23c7127e __exceptionPreprocess + 350
1   libobjc.A.dylib    0x00007fff513fbb20 objc_exception_throw + 48
2   CoreFoundation     0x00007fff23c710bc +[NSException raise:format:] + 188
3   UIKitCore          0x00007fff47fb21cd -[_UIConcretePasteboard setString:] + 185
4   UIPasteboardwack   0x0000000109a7bc40 $s16UIPasteboardwack14ViewControllerC11viewDidLoadyyF + 816

Шаги:

  1. создать новый проект.
  2. Сделайте это:
override func viewDidLoad() {
   super.viewDidLoad()
   UIPasteboard.general.string?.append("We are appending first ")
}
выйти из симулятора, если он открыт. запустить приложение на имитированной iPhone 8 или более ранней версии.

UIPasteboard документы

UIPasteboard исходный код

Фон Так что мне понадобилось в то время как выяснить, как воссоздать это, потому что в некоторых случаях свойство строки не установлено, но все равно возвращает Optional(""), например, при использовании iPhone 11 перед установкой значения в строку.

Также может показаться, что если строка возвращает nil, метод append должен молча завершиться ошибкой. Я также не понимаю, как setString на UIConcretePasteboard вызывается.

1 Ответ

1 голос
/ 08 февраля 2020

Пока не будет предоставлен полный ответ, это мой текущий патч.

import UIKit

extension UIPasteboard {

    ///This is a safe alternative to UIPasteboard's string setter property.
    ///While the string property is optional, if you assign the value nil, it will crash.
    func safe(set new: String) {
        string = new
    }

    ///Since the string property is a computed property, if you attempt to append to it, it won't silently fail when string returns nil, instead it will crash.
    func safe(append new: String) {
        if !hasStrings {
            safe(set: new)
        } else {
            string?.append(new)
        }
    }
}

Я не удовлетворен этим текущим ответом, потому что, хотя это самая безопасная вещь, о которой я могу думать, не понимая причину root, я не могу гарантировать это решение.

...