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

Swift 5.10中func3和func4为何不遵循Common协议?

为什么返回Self/Model的方法不遵循Common协议

在Swift 5.10中,协议作为返回类型时,默认会被解析为存在类型(existential type)——即使你省略any关键字,编译器也会把Common等同于any Common。这是理解问题的核心前提。

具体原因

协议Common中定义的方法要求返回Common(即any Common),这意味着方法需要返回一个“遵循Common协议的任意类型的存在实例”。而:

  • func func3() -> Self和func func4() -> Model的返回类型是具体类型(Model),并非协议的存在类型any Common。
  • Swift的协议遵循要求方法签名严格匹配,具体类型和对应协议的存在类型之间没有继承关系,仅存在“实例可装箱转换”的关系——这种转换无法替代签名的匹配要求,因此这两个方法不满足协议约束。

为什么func func2() -> Common {self}可以通过编译

这里的Common被编译器解析为any Common,返回的self(Model实例)会被隐式装箱为any Common类型,因此方法签名完全匹配协议要求。

两种解决方案

  1. 修改协议,使用关联类型约束返回类型
    如果希望方法返回具体类型,可以给协议添加关联类型,让遵循类型指定返回自身:

    protocol Common {
        associatedtype ReturnType: Common = Self
        func func1() -> ReturnType
        func func2() -> ReturnType
        func func3() -> ReturnType
        func func4() -> ReturnType
    }
    
    struct Model: Common {
        func func1() -> Model { self }
        func func2() -> Model { self }
        func func3() -> Self { self }
        func func4() -> Model { self }
    }
    
  2. 保持原协议,修改返回类型为存在类型
    按照Xcode的建议,将方法返回类型改为any Common(或简写为Common),让实例装箱为存在类型:

    struct Model: Common {
        func func1() -> any Common { self }
        func func2() -> Common { self }
        func func3() -> any Common { self }
        func func4() -> any Common { self }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:12:49