我在操场上运行以下命令(我已经在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

我的问题如下:
  • 这是由内部UIPasteboard实现引起的(即,从NSString显式转换为NSConcreteMutableData),还是这种标准的ObjC-Swift桥接行为?
  • 如何解决此问题,以将自定义键/值对存储在UIPasteboard中?

  • 这是操场上的样子,以供参考:

    ios - 是什么导致UIPasteboard中的项目转换为NSConcreteMutableData?-LMLPHP

    最佳答案

    您获得的Dataitem[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/

    10-10 20:35