You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从其他扩展中调用针对可选数组的自定义扩展方法?

如何从其他扩展中调用针对可选数组的自定义扩展方法?

嘿,这问题我刚好踩过坑,给你唠唠怎么解决~

首先我们先定义一个针对可选数组的扩展,用来实现单个元素的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:59:30