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

React Native原生模块开发:Swift中append方法调用无精确匹配错误排查

问题排查与解决方案

这个错误的核心原因是类型不匹配:你定义的result是[AnyHashable]类型(存储单个可哈希值的数组),但你试图添加的resultPoint是[AnyHashable: Any]类型的字典——字典本身并不是AnyHashable的实例,所以Swift找不到匹配的append方法。

最优解决方案

结合你向React Native传递坐标点数组的业务场景,正确的做法是把result的类型改为字典数组[[AnyHashable: Any]],这样就能正常添加每个点的字典数据,同时也更符合跨端数据交互的常规结构。修改后的代码如下:

func getCornerPoints(_ cornerPoints: [AnyHashable]?) -> [[AnyHashable: Any]]? {
    var result: [[AnyHashable: Any]] = []
    guard let cornerPoints = cornerPoints else {
        return result
    }
    for point in cornerPoints {
        guard let pointValue = point as? NSValue else { continue }
        let cgPoint = pointValue.cgPointValue
        let resultPoint: [AnyHashable: Any] = [
            "x": NSNumber(value: Float(cgPoint.x)),
            "y": NSNumber(value: Float(cgPoint.y))
        ]
        result.append(resultPoint) // 现在可以正常调用append了
    }
    return result.isEmpty ? nil : result // 可选优化:为空时返回nil,贴合原方法的返回逻辑
}

额外说明

  1. 我优化了原代码的可选绑定逻辑,用guard let替代了if nil判断,让代码更简洁易读;
  2. 如果你的业务逻辑必须强制保持返回值为[AnyHashable]?,可以把字典手动包装成AnyHashable(但这在React Native交互场景下完全没必要,反而会增加前端解析的复杂度),示例代码如下:
// 不推荐的方案(仅为满足类型要求)
func getCornerPoints(_ cornerPoints: [AnyHashable]?) -> [AnyHashable]? {
    var result: [AnyHashable] = []
    guard let cornerPoints = cornerPoints else {
        return result
    }
    for point in cornerPoints {
        guard let pointValue = point as? NSValue else { continue }
        let cgPoint = pointValue.cgPointValue
        let resultPoint: [AnyHashable: Any] = [
            "x": NSNumber(value: Float(cgPoint.x)),
            "y": NSNumber(value: Float(cgPoint.y))
        ]
        result.append(AnyHashable(resultPoint)) // 手动包装成AnyHashable
    }
    return result.isEmpty ? nil : result
}

内容的提问来源于stack exchange,提问作者dimasjt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:39:07