2016-11-12 25 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。 –

相关问题