And*_*ius 40 dictionary swift swift2
我正在尝试创建一个字典扩展,其中Dictionary的类型为<String,AnyObject>.
在许多地方寻找并尝试不同的方法,但它们似乎都没有工作.这是其中之一:
extension Dictionary where <String, AnyObject>{
var jsonString:String {
return ""
}
}
Run Code Online (Sandbox Code Playgroud)
另一种因某种原因实际上无法工作的方法:
extension Dictionary where Key:Hashable, Value:AnyObject {
var jsonString:String {
do {
let stringData = try NSJSONSerialization.dataWithJSONObject(self, options: NSJSONWritingOptions.PrettyPrinted)
if let string = String(data: stringData, encoding: NSUTF8StringEncoding){
return string
}
}catch _ {
}
return ""
}
}
Run Code Online (Sandbox Code Playgroud)
得到:参数类型'Dictionary'不符合'AnyObject'的预期类型
Log*_*gan 90
从3.1开始,我们可以进行具体的扩展,即:
extension Dictionary where Key == String {}
Run Code Online (Sandbox Code Playgroud)
我们不能使用具体的泛型来符合具体类型,即:
extension Dictionary where Key == String
Run Code Online (Sandbox Code Playgroud)
但是,因为Dictionary符合序列,我们可以使用具体泛型的协议类型,我们可以这样做:
extension Sequence where Iterator.Element == (key: String, value: AnyObject) {
func doStuff() {...
Run Code Online (Sandbox Code Playgroud)
否则,我们可以将键限制为字符串符合的协议:
extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
var jsonString: String {
return ""
}
}
Run Code Online (Sandbox Code Playgroud)
根据您更新的答案.Json序列化需要一个对象,Swift Dictionaries是结构.您需要转换为NSDictionary 您必须指定Key符合NSObject以正确转换为NSDictionary.
小记:字典已经输入限制
Key是Hashable,让你的原始约束不添加任何.
extension Dictionary where Key: NSObject, Value:AnyObject {
var jsonString:String {
do {
let stringData = try NSJSONSerialization.dataWithJSONObject(self as NSDictionary, options: NSJSONWritingOptions.PrettyPrinted)
if let string = String(data: stringData, encoding: NSUTF8StringEncoding){
return string
}
}catch _ {
}
return ""
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,字典必须符合此类型才能访问扩展.
let dict = ["k" : "v"]
Run Code Online (Sandbox Code Playgroud)
将成为类型[String : String],因此您必须明确声明:
let dict: [NSObject : AnyObject] = ["k" : "v"]
Run Code Online (Sandbox Code Playgroud)
Swift 3 的更新
这是我使用ExpressibleByStringLiteralforKey和Anyfor 的示例Value。
extension Dictionary where Key: StringLiteralConvertible, Value: Any {
var jsonString: String? {
if let dict = (self as AnyObject) as? Dictionary<String, AnyObject> {
do {
let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions(rawValue: UInt.allZeros))
if let string = String(data: data, encoding: String.Encoding.utf8) {
return string
}
} catch {
print(error)
}
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
然后我像这样使用它:
let dict: Dictionary<String, AnyObject> = [...]
let jsonString = dict.jsonString
Run Code Online (Sandbox Code Playgroud)
您可以将 self 转换为 AnyObject 或 NSObject,两者都有效,然后您将其解包为 Dictionary 或任何其他特定类型。
小智 6
迅捷3方法
extension Dictionary where Key: ExpressibleByStringLiteral, Value: AnyObject
Run Code Online (Sandbox Code Playgroud)
由于StringLiteralConvertible现在已被弃用,并由ExpressibleByStringLiteral取代
小智 5
添加到 @Logan 提供的答案,对于那些希望将自定义属性添加到 string-subscripted 的人来说Dictionary,这也是可能的(当我遇到这个 SO 问题时,我希望这样做):
extension Dictionary where Key: StringLiteralConvertible {
var somePropertyThatIsAColor:UIColor? {
get {
return self["someKey"] as? UIColor
}
set {
// Have to cast as optional Value
self["someKey"] = (newValue as? Value)
}
}
Run Code Online (Sandbox Code Playgroud)
任何使用[String:Any]而不是Dictionary可以使用下面的扩展
extension Dictionary where Key == String, Value == Any {
mutating func append(anotherDict:[String:Any]) {
for (key, value) in anotherDict {
self.updateValue(value, forKey: key)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25880 次 |
| 最近记录: |