2016-03-14 15:17:44 lvchaman 阅读数 1204
- (void)dicToDataTodic{
    NSDictionary *dic = @{@"name":@"tang",@"age":@"18"};
    
    NSData *data =    [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
    
    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    
    NSLog(@"NSDictionary 转 NSData = %@",data);
    
    NSLog(@"NSData 转 NSDictionary =%@,%@",dictionary,dictionary[@"name"]);

}

------》以上就可以用

- dic转nsdata
+ (NSData *)returnDataWithDic:(NSDictionary *)dicP{

    // 给所有的Key排序
    NSArray *keys = [[dicP allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [(NSString *)obj1 compare:obj2];
    }];
    
    NSMutableString *parame = [NSMutableString string];
    //将字符串转NSData
    for(NSUInteger i=0; i<[keys count]; i++) {
        NSString *key = [keys objectAtIndex:i];
        [parame appendFormat:@"%@=%@&",key,[dicP objectForKey:key]];
    }
    NSData * contentData = [parame dataUsingEncoding:NSUTF8StringEncoding];

    return contentData;
}

2018-05-11 15:48:14 yingBi2014 阅读数 2002

本篇介绍数据转模型Codable的使用,Codable是苹果自带的基于KVC编码的数据转换模型的协议。
先创建对应的model

let dic = ["name":"wall" , "age":"22" , "h":"170"]
//转为data数据,这里其实要判断data是否为nil
let data = try? JSONSerialization.data(withJSONObject: dic, options: [])
struct Person :Codable {
    var name:String
    var age:Int
    var height:Int

    private enum CodingKeys : String , CodingKey {
        case name
        case age
        //修改height属性的接收关键字为h
        case height="h"
    }
}

PS:model中的属性名和json中的key要相同,如果不想相同的话,要创建一个CodingKeys的枚举,遵循CodingKey协议,在里面更改为你想接收的属性名。
PS2:如果model中的类型和被接收的不同的话,如dic中是”22”,model中是Int类型的,是会转换失败的,还有一点,model中的属性要么给初始值,要么用可选项,要避免上面两点,可以将这里的CleanJson.swift
拖入工程中,这样以后model中的类型会自动转换,并且model的属性不用设置初始值,也不用设置成可选项。

2、进行转换

do {
            let model = try JSONDecoder().decode(Person.self, from: data!)
            print(model.name , model.age , model.height)
  } catch let error {
            print(error)
  }

输出如下 : wall 22

3、model嵌套
假如要转换的数据结构如下

let dic = ["name":"wall" , "age":"22" , "h":"170" , "school":["name":"北大"]] as [String : Any]

school是一个单独的字典,所有model也要进行嵌套,model写法如下,跟一个model写法类似,小model也要遵循Codable协议。

struct Person :Codable {
    var name:String
    var age:Int
    var height:Int
    var school:School

    private enum CodingKeys : String , CodingKey {
        case name
        case age
        case height="h"
        case school
    }
}

struct School : Codable {
    var name:String
}
2019-12-19 13:41:41 wotingdaonile 阅读数 11
function UIUtils.DicToTable(CSharpDic)
    --将C#的Dic转成Lua的Table
    local dic = {}
    if CSharpDic then
        local iter = CSharpDic:GetEnumerator()
        while iter:MoveNext() do
            local k = iter.Current.Key
            local v = iter.Current.Value
            dic[k] = v
        end
    end
    return dic
end
function UIUtils.ListToTable(CSharpList)
    --将C#的List转成Lua的Table
    local list = {}
    if CSharpList then
        local index = 1
        local iter = CSharpList:GetEnumerator()
        while iter:MoveNext() do
            local v = iter.Current
            list[index] = v
            index = index + 1
        end
    else
        logError("Error,CSharpList is null")
    end
    return list
end

 

2013-12-05 13:51:52 yangkunlll 阅读数 355

+(MicroPage*)creatPage:(NSMutableDictionary*)dic
{
    //反射 对象赋值
    
    MicroPage *m = [[[MicroPage alloc] init] autorelease];
    unsigned int outCount;
    objc_property_t *properties = class_copyPropertyList([m class], &outCount);
    for (int i=0; i<outCount; i++) {
        const char *pName = property_getName(properties[i]);
        NSString *propertyName = [NSString stringWithCString:pName encoding:NSUTF8StringEncoding];
        id value = [dic objectForKey:propertyName];
        [m setValue:value forKey:propertyName];
    }
    return m;
}


2014-12-16 14:26:26 weasleyqi 阅读数 12998

顾名思义,当我们查字典的时候,我们会根据索引去查找我们需要查找的资源,在swift中也是如此,字典的每一个对象都包含一个key和一个value,我们通过key去查找当前这个key所对应的value,与数组不同的是字典中的数据项在字典中没有具体的存储顺序。

和Swift中数组类似的,在Swift可变字典与不可变字典仅仅通过let和var的定义来区分,而在OC中是通过NSDictionary和NSMutableDictionary来区分的。

Swift的字典定义为:(key: value),对于key和value是有限制的,key的唯一限制是可hash的,这样就能保证key是独一无二的,key的address就为:addr = hash(key) , value = hashTavle[addr],先获取到key的地址,然后在哈希表中通过找到的key的地址来找到value的值。


字典的构造:
与数组类似的,字典也有很多相似的语法:
var dict = ["key1":"value1" , "key2":"value2"]
println(dict)

输出为:[key1: value1, key2: value2]
我们知道swift具有类型推导的功能,我们不用定义key和value的类型,OS就能帮我们推导出key和value都是String类型。

我们也可以在申明一个字典的时候定义好字典中key和value的类型。
var dict2 : Dictionary<String, Int> = ["key1":1, "key2":2]
println(dict2)

输出为:[key1: 1, key2: 2]

当然我们也有一种省略一点的定义方式:
var dict3 : [String : Int] = ["key3": 3, "key4":4]
println(dict3)

输出为:[key4: 4, key3: 3]

我们也可以像数组一样使用构造语句来创建一个空字典:
var emptyDict = Dictionary<String, String>()

此时我们就创建了一个key和value都是字符串的空字典;
如果我们在创建字典的时候不知道要放什么类型的数据,我们也可以利用swift的类型推导功能在以后添加数据项的时候自动推导:
var emptyDict2 = [ : ]


数组的操作:
对数据的基础操作包含增删改查,对字典的操作同样如此:
对字典新增一项时,我们可以通过下标来添加新的数据项,比如对dict添加一项:
dict["key3"] = "value3"
println(dict)

此时dict中有三项了,输出为:[key1: value1, key3: value3, key2: value2]

修改字典中某一项的值时也可以用下标来进行操作:
dict["key1"] = "NOValue"
println(dict)

此时的输出就为:[key1: NOValue, key3: value3, key2: value2]
swift还提供了一个updateValue的方法来更新字典中的值,
dict.updateValue("123", forKey: "key4")
println(dict)

如果key存在则更新key所对应的value,如果key不存在则新增一条记录。

和数组一样,我们可以通过字典的只读熟悉count来获取字典中的数据项的数量。

如果我们需要从一个字典中移除某个数据项,有这么2种方式:
1、用下标的方式来给某个键的对应值赋值为nil,这个该数据项就从字典中移除了:
dict["key4"] = nil
println(dict)

从输出中我们可以明显的看出key4所对应的数据项已经从字典中移除掉了;
2、用swift提供的函数:removeValueForKey:
dict.removeValueForKey("key1")
println(dict)

3、用removeAll方式来移除所有数据项。


字典遍历
还记得在数组的遍历中有2种方式,一种是for-in循环来遍历,一种是enumerate来遍历数据项和索引返回一个元祖,在字典的遍历中有下面几种方式:
1、for-in循环:
var dict = ["key1" : "value1" , "key2" : "value2" , "key3" : "value3"]

for key in dict{
    println(key)
}

for (key,value) in dict{
    println("key is \(key) and value is \(value)")
}

for (key, _) in dict {
    println(key)
}

for (_, value) in dict {
    println(value)
}


输出为:

(key1, value1)
(key3, value3)
(key2, value2)
key is key1 and value is value1
key is key3 and value is value3
key is key2 and value is value2
key1
key3
key2
value1
value3
value2


我们看到这几种方式,第一种直接打印出键值对的值,第二种我们的条件里面写了一个元组,分别打印key和value,第三种我们加了一个下划线,表示我们不关心第二项value的值,我们只要第一项,第四种方式即我们只关心value的值:


2、我们可以通过字典的keys熟悉来返回当前字典的所有的key,同样可以返回字典的所有value,
for keys in dict.keys {
    println(keys)
}

for values in dict.values {
    println(values)
}

字典的keys和values返回的是一个集合,我们可以直接使用keys或者values属性来构造一个新数组:
let keysArray = Array(dict.keys)
println(keysArray)

字典中的数据项是无序排列的,当我们遍历字典的时候,key和value会重新排列,而且其中的顺序是不固定的。



欢迎大家指导,共同学习。





Swift 字典

阅读数 261

没有更多推荐了,返回首页