习惯了OC的写法之后转向Swift开发,其实挺容易的,刚开始写的时候按照OC的写法写Swift一样能写出很不错的APP,但是,如果全都一样的话,为什么苹果还要推Swift这样的新语言嘞?
相比于OC Swift有着很方便的写法,只要沾上Swift,根本戒不掉(Swift3以下除外???), 小伙伴们都知道OC是纯面向对象的思想,但是Swift又新加了面向协议的思想,那么面向协议到底是什么玩意
举个例子我有个需求就是把Array,Dictionary通过简单的方法转换成Data
在OC中我们需要定义分别为NSArray,NSDictionry用分类增加方法
@implementation NSArray (Extension)
-(NSData *)toData
{
NSData *data = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:nil];
return data;
}
@end
复制代码
@implementation NSDictionary (Extension)
-(NSData *)toData
{
NSData *data = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:nil];
return data;
}
@end
复制代码
这样NSArray,NSDictionry 就都有了转换data的方法toData
但是这两个方法的功能,方法名,方法实现都一样,同样的代码写两遍显然不符合代码规范 但是在OC中好像没有更合理的方法,但是利用Swift面向协议的特性我们有如下方法
/// 定义一个 SerializationToData 协议
protocol SerializationToData {
//此处可以不写此方法因为在extension 不仅有此方法还有此方法的默认实现
func toData() -> Data
}
// MARK: - 为SerializationToData协议扩展方法
extension SerializationToData {
//转换Data的方法
func toData() -> Data {
let data = try? JSONSerialization.data(withJSONObject: self, options: [])
return data!
}
}
// MARK: - 声明支持SerializationToData 协议
extension Dictionary : SerializationToData {
}
// MARK: - 声明支持SerializationToData 协议
extension Array : SerializationToData{
}
复制代码
在Swift中声明一个SerializationToData 协议,协议中包含toData() 方法 通过extension 为toData()方法添加默认实现, 再声明Dictionary Array 支持SerializationToData 这样我们的Dictionary Array都有了转换成Data的方法toData()并且有了实现方法
同理,我们的String也需要一个简单的方法转换成Data 好办
// MARK: - 声明支持SerializationToData 协议
extension String : SerializationToData {
}
复制代码
这样就OK了?NO
String转换data的实现方法并不能通过 let data = try? JSONSerialization.data(withJSONObject: self, options: [])这个方法来实现(会崩溃的),所以我们要这样
// MARK: - 声明支持SerializationToData 协议
extension String : SerializationToData {
func toData() -> Data {
return self.data(using: .utf8)!
}
}
复制代码
这样就覆盖了SerializationToData 协议中toData()方法的默认实现,现在我们的String,Array, Dictionary都可以通过toData()方法转换成Data
通过面向协议可以解决我们面向对象的横切关注点问题,还有像C++那样多继承的菱形缺陷