Получение ошибки при попытке получить текст из картона в macOS

Я хотел бы получить текст из буфера обмена. Я написал код, который, кажется, работает, но иногда он дает сбой, например, когда я пытаюсь использовать приложение, когда я вхожу в систему как гость. Может быть, потому что картон не мог содержать текст.

Это код, который я использую, я хотел бы обернуть последнюю строку в условный оператор, но, похоже, уже слишком поздно это делать, потому что в этот момент я получаю сообщение об ошибке.

func pasteOverAction() {
     // create a pasteboard instance
    let pasteboard = NSPasteboard.general()

    // create an array for put pasteboard content
    var clipboardItems: [String] = []

    // iterate elements in pasteboard
    for element in pasteboard.pasteboardItems! {

        // if it's text
        if let str = element.string(forType: "public.utf8-plain-text") {
            clipboardItems.append(str) // put in the array
        }
    }

    // put the first element of the array in a constant
    // sometimes crashes here
    let firstStringOfClipboard = clipboardItems[0] 
}

person Cue    schedule 04.04.2017    source источник
comment
Ваша проблема .pasteboardItems!. Вы не должны принудительно разворачивать необязательный. Вместо этого обработайте возможность того, что это свойство равно нулю.   -  person Eric Aya    schedule 04.04.2017
comment
Тип UTI должен быть "public.plain-text"   -  person Leo Dabus    schedule 04.04.2017


Ответы (1)


Я обнаружил проблему. Когда в буфере обмена еще нет текста (например, когда вы только что вошли в систему с гостевым пользователем), в созданном массиве нет элементов, и вы получаете ошибку вне диапазона. Я решил, добавив проверку, чтобы избежать ошибки.

Код аналогичен коду вопроса, за исключением части между пунктирными линиями.

func pasteOverAction() {
    // create a pasteboard instance
    let pasteboard = NSPasteboard.general()

    // create an array for put pasteboard content
    var clipboardItems: [String] = []

    // iterate elements in pasteboard
    for element in pasteboard.pasteboardItems! {

        // if it's text
        if let str = element.string(forType: "public.utf8-plain-text") {
            clipboardItems.append(str) // put in the array
        }
    }

    // Added part ----------------------------------------
    // avoid out of range if there is not a tex item
    let n = clipboardItems.count
    if n < 1 {
        NSBeep() // warn user that there is not text in clipboard
        return // exit from the method
    }
    // ---------------------------------------------------

    // put the first element of the array in a constant
    // now don't crashes here anymore
    let firstStringOfClipboard = clipboardItems[0] 
}
person Cue    schedule 06.04.2017