2017-04-04 9 views
0

クリップボードからテキストを取得したいとします。私は動作しているようだが、クラッシュすることがあるようなコードを書いている。たとえば、ゲストユーザとしてログインしたときにアプリを使用しようとすると、クラッシュすることがある。 Pasterboardにテキストが含まれていない可能性があります。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] 
} 
+1

問題は '.pasteboardItems!'です。オプションを強制的に展開しないでください。代わりに、このプロパティの可能性をゼロにしてください。 – Moritz

+1

UTIタイプは '' public.plain-text ''でなければなりません –

答えて

0

この問題を発見しました。クリップボードにまだテキストが表示されていない場合(たとえば、ゲストユーザーでログインしたときなど)、作成された配列には項目がなく、範囲外のエラーが発生します。私はエラーを避けるためにチェックを追加して解決しました。

コードは、点線の間の部分を除いて、質問の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] 
} 
関連する問題