如何从其他扩展中调用针对可选数组的自定义扩展方法?
如何从其他扩展中调用针对可选数组的自定义扩展方法?
嘿,这问题我刚好踩过坑,给你唠唠怎么解决~
首先我们先定义一个针对可选数组的扩展,用来实现单个元素的upsert(插入或更新)操作,代码是这样的:
// 注意:如果要在其他扩展中调用,建议把fileprivate改成internal或public fileprivate extension Optional { /// 对单个元素执行upsert操作 - 适用于所有分组 mutating func upsert<T: MyProtocol>(item: T) where Wrapped == [T] { // 这里可以补上具体的upsert逻辑,比如判断元素是否存在,存在就更新,不存在就插入 } }
这个扩展是给Optional类型写的,专门限定了它的关联类型是遵循MyProtocol的元素数组,这样只要你的可选数组里的元素符合MyProtocol,就能用这个upsert方法。不过重点来了:原始代码里的fileprivate访问权限只能让这个扩展在当前文件内可用,要是你想在其他扩展(比如不同文件里的结构体/类扩展)中调用,一定要把权限改成internal(同模块内所有地方都能用,Swift默认权限就是这个)或者public(跨模块也能调用),不然会直接报错访问不到哦。
接下来就是调用的方式啦,非常直观,针对每个分组的更新数据循环调用就行:
for i in updates.dogs { stuff.dogs.upsert(item: i) } for i in updates.cats { stuff.cats.upsert(item: i) } ... dozens of those ... ... dozens of those ... for i in updates.chooks { stuff.chooks.upsert(item: i) }
要是你觉得反复写循环有点啰嗦,其实还可以再封装一个批量处理的扩展方法,直接把整个数组传进去一次处理,但如果就按当前的需求来,上面的调用方式完全够用啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

