Swift 面向协议开发

习惯了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++那样多继承的菱形缺陷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值