2016-11-12 2 views
1

Я бегу следующее в детской площадке (я тестировал в Xcode 7.3.1, а также Xcode 8.1 и увидеть такое же поведение):Что вызывает преобразование элементов UIPastboard в 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-Swift поведение шунтирование?

  2. Как я могу обойти это, чтобы хранить пользовательские пары ключ/значение в UIPboardboard?

Вот как это выглядит на детской площадке, для удобства:

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)") 

Делать это позволяет избежать необходимости определения ИМП и позволяет избежать замены всех существующих элементов на монтажном столе.

+2

Обратите внимание, что если вы импортируете MobileCoreServices', вы можете использовать 'kUTTypeText as String' в качестве своего ключа вместо hardcoding' 'public.text" ', если вы хотите указать UTI. –

Смежные вопросы