如何将[String:Any]转换为[NSAttributedStringKey:Any]

Cœu*_*œur 2 nsattributedstring swift swift4

处理一些objC API,我收到一个NSDictionary<NSString *, id> *>转换为[String : Any]Swift的,我用于NSAttributedString.addAttributes:range : .

但是,此方法签名现在已随Xcode 9更改,现在需要一个[NSAttributedStringKey : Any].

let attr: [String : Any]? = OldPodModule.getMyAttributes()
// Cannot assign value of type '[String : Any]?' to type '[NSAttributedStringKey : Any]?'
let newAttr: [NSAttributedStringKey : Any]? = attr
if let newAttr = newAttr {
    myAttributedString.addAttributes(newAttr, range: range)
}
Run Code Online (Sandbox Code Playgroud)

如何将a转换[String : Any][NSAttributedStringKey : Any]

Ham*_*ish 14

NSAttributedStringKey一个初始化器,需要一个String,你可以使用Dictionaryinit(uniqueKeysWithValues:)初始化器,以建立从键值元组的序列,其中每个键是唯一一本字典(如这里的情况).

我们只需要应用一个转换attr,将每个String键转换NSAttributedStringKey为调用Dictionary初始化之前的值.

例如:

let attributes: [String : Any]? = // ...

let attributedString = NSMutableAttributedString(string: "hello world")
let range = NSRange(location: 0, length: attributedString.string.utf16.count)

if let attributes = attributes {
    let convertedAttributes = Dictionary(uniqueKeysWithValues:
        attributes.lazy.map { (NSAttributedStringKey($0.key), $0.value) }
    )
    attributedString.addAttributes(convertedAttributes, range: range)
}
Run Code Online (Sandbox Code Playgroud)

我们在lazy这里使用以避免创建不必要的中间数组.

  • 谢谢!为了详尽无遗,我不得不做相反的操作(`[NSAttributedStringKey:Any]`到`[String:Any]`),在这种情况下它是`Dictionary(uniqueKeysWithValues:attr.lazy.map {($ 0. key.rawValue,$ 0.value)})`. (3认同)