我在操场上运行以下命令(我已经在Xcode 7.3.1和Xcode 8.1中进行了测试,并看到相同的行为):
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
。我的问题如下:
NSString
显式转换为NSConcreteMutableData
),还是这种标准的ObjC-Swift桥接行为? 这是操场上的样子,以供参考:
最佳答案
您获得的Data
的item[key]
只是字符串的UTF-8编码值。
如果添加以下case
,将会看到:
case let x as Data:
let str = String(data: x, encoding: .utf8)
print("str = \(str)")
造成混淆的原因是
items
属性使用的密钥是UTI,而不是随机密钥。如果将密钥更改为public.text
,则您的代码将按预期工作。通常,您不会使用
items
属性在粘贴板上放置字符串。您将使用string
属性读取和写入该值。UIPasteboard.general.string = "Hello"
let aStr = UIPasteboard.general.string
print("aStr = \(aStr)")
这样做避免了指定UTI的需要,并且避免了替换粘贴板上的所有现有项目。
关于ios - 是什么导致UIPasteboard中的项目转换为NSConcreteMutableData?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40559111/