Swift 在macOS中尝试从粘贴板获取文本时出错

Swift 在macOS中尝试从粘贴板获取文本时出错,swift,macos,nspasteboard,Swift,Macos,Nspasteboard,我想从剪贴板中获取文本。我写了一个代码,似乎工作,但有时它崩溃,例如,当我试图使用该应用程序时,当我作为客人用户登录。可能是因为粘贴板不能包含文本 这就是我正在使用的代码,我想用条件语句包装最后一行,但这样做似乎太晚了,因为在那一点上我收到了一个错误 func pasteOverAction() { // create a pasteboard instance let pasteboard = NSPasteboard.general() // create an

我想从剪贴板中获取文本。我写了一个代码,似乎工作,但有时它崩溃,例如,当我试图使用该应用程序时,当我作为客人用户登录。可能是因为粘贴板不能包含文本

这就是我正在使用的代码,我想用条件语句包装最后一行,但这样做似乎太晚了,因为在那一点上我收到了一个错误

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] 
}

我发现了这个问题。当剪贴板中还没有文本时(例如,当您刚刚与来宾用户登录时),创建的数组中没有任何项,您会收到超出范围的错误。我通过添加一个检查来避免错误

代码与问题中的代码类似,除了虚线之间的部分

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] 
}
func pasteOverAction(){
//创建粘贴板实例
让pasteboard=NSPasteboard.general()
//创建用于放置粘贴板内容的数组
var clipboardItems:[字符串]=[]
//在粘贴板中迭代元素
用于pasteboard.pasteboardItems中的元素{
//如果是文本
如果let str=element.string(forType:“public.utf8纯文本”){
clipboardItems.append(str)//放入数组
}
}
//附加部分----------------------------------------
//如果没有tex项目,请避免超出范围
设n=clipboardItems.count
如果n<1{
NSBeep()//警告用户剪贴板中没有文本
return//exit退出该方法
}
// ---------------------------------------------------
//将数组的第一个元素放入常量中
//现在不要再在这里撞车了
让firstStringOfClipboard=clipboardItems[0]
}

您的问题是
。粘贴板项目。您不应强制展开可选文件。相反,处理此属性为nil的可能性。UTI类型应为
“public.plain text”