之前为了封装URLNavigator路由框架,当要传递控制器的参数的时候,需要用到传json字符串,然后接收的时候再把json字符串转换成对象.所以今天做了这个protocol协议,只要让模型的类遵守协议,然后啥都不用写,就能直接调用方法,为了进一步封装URLNavigator做准备
protocol中,之所以放在protocol而不是class类中的原因是swift不支持多重继承class但是可以多重继承protocol,因为swift不允许继承多个类,如果用户的类继承了我们的类,那么就不能再继承其他类,这样很不方便,但是放到协议里就可以同时继承类和协议,或者继承多个协议和1个类.
假如把我们的协议改成class会报错:Multiple inheritance from classes ‘NSObject’ and ‘TdwModelToJsonString’,意思是“NSObject”和“TdwModelToJsonString”类的多重继承,因为模型的类又继承了NSObject
第一段是制作了一个协议,里面添加了getString()方法,目的是把类对象,转换成json字符串,这个字符串,打印出来,是直接你能在网页上线解析的正确格式,支持无线嵌套,继承Codable协议的目的是为了使用里面的JSonEncoder().encode 和 JSonEncoder().encode 和JSonDecoder().decode()这2个方法来编码和解码,这个是swift 4.0以后苹果官方出的json编码解码协议里的方法
模型里面需要做的是知识遵守协议TdwModelToJsonString,并且给模型都添加@objc,或者在模型类前面添加@objcMembers,否则运行时候回找不到成员变量.School模型里面只添加了2个成员:name和address .重写description是为了一会打印验证结果方便,因为类对象直接打印只显示实例对象的地址
Student模型,friends成员变量里面嵌套了学生模型的数组,为了验证我们的方法可以支持嵌套模型的转换,这里没有在4个成员变量前边添加@objc,而是在类前面添加了@objcMembers,这样所有能转换成oc的成员变量都暴露给oc能使用的runtime机制
下面代码1个学校,3个学生,每个学生的 friends是对象数组,我们把对象zhang3转化成json字符串
这段代码jsonStr是类成员变量,保存了之前的json字符串
打印结果: 可以看到obj实例对象里面的成员,都被正确赋值了.
-
obj.school.address= song hua jiang bian NO.23
-
obj.friends[0]= [“age”: 20, “name”: li4, “friends”: <Swift.__EmptyArrayStorage 0x1c9e436e8>(
)
, “school”: [“address”: song hua jiang bian NO.23, “name”: 76zhong]]
- obj= [“age”: 30, “name”: zhang3, “friends”: <TtGCs23_ContiguousArrayStorageC16tdwModelJsonDemo7Student$ 0x6000005452c0>(
[“name”: li4, “friends”: <Swift.__EmptyArrayStorage 0x1c9e436e8>(
)
, “age”: 20, “school”: [“address”: song hua jiang bian NO.23, “name”: 76zhong]],
[“school”: [“address”: song hua jiang bian NO.23, “name”: 76zhong], “name”: wang5, “age”: 18, “friends”: <Swift.__EmptyArrayStorage 0x1c9e436e8>(
)
]
)
, “school”: [“address”: song hua jiang bian NO.23, “name”: 76zhong]]