2016-11-12 29 views
1

我跑在操場下面的(我在Xcode 7.3.1以及Xcode的8.1測試,並看到相同的行爲):是什麼導致來自UIPasteboard的項目轉換爲NSConcreteMutableData?

import UIKit 

let key: String = "some_key" 
let value: String = "some_value" 

UIPasteboard.general.items = [[key: value]] 

let item = UIPasteboard.general.items.first 
if let item = UIPasteboard.general.items.first { 
    switch item[key] { 
    case let x as String: 
     print("This is expected") 
    case let x as Any: 
     type(of: x) 
     print("This is unexpected") 
    default: 
     print("This is unexpected") 
    } 
} else { 
    print("This is unexpected") 
} 

而且我注意到String,我投入剪貼板實際上被橋接爲NSConcreteMutableData

我的問題有以下幾點:

  1. 這是造成內部UIPasteboard實現(即明確從NSString轉換爲NSConcreteMutableData),或者是這個標準的ObjC - 斯威夫特橋接行爲?

  2. 我該如何解決這個問題才能在UIPasteboard中存儲自定義鍵/值對?

以下是這看起來像一個操場,以方便參考:

enter image description here

回答

2

Data你得到item[key]僅僅是該字符串的UTF-8編碼值。

如果添加以下case,你會發現:

case let x as Data: 
    let str = String(data: x, encoding: .utf8) 
    print("str = \(str)") 

混亂的原因是由items屬性使用的密鑰是尿路感染,而不是隨機密鑰。如果您將密鑰更改爲public.text,則代碼將按預期工作。

通常情況下,您不會使用items屬性在粘貼板上放置字符串。您將使用string屬性讀取和寫入該值。

UIPasteboard.general.string = "Hello" 
let aStr = UIPasteboard.general.string 
print("aStr = \(aStr)") 

這樣做可避免需要指定UTI並避免替換粘貼板上的所有現有項目。

+2

請注意,如果你導入MobileCoreServices',你可以使用'kUTTypeText作爲String'作爲你的密鑰而不是硬編碼''public.text'',如果你想指定UTI。 –

相關問題