SwiftUI中结构体未显式实现协议要求的原因探究
为什么SwiftUI中的类型遵循协议却无需显式实现要求?
你的疑问核心在于自定义协议和Apple框架协议的实现逻辑差异,原因主要有这几点:
协议自带默认实现
Swift允许通过协议扩展给协议要求提供默认实现。比如Shape协议的核心要求path(in:),Apple可能已经在Shape的协议扩展里给Path这类框架内置类型提供了默认实现,或者在Path的内部私有扩展中完成了方法实现,只是公开接口代码里没展示出来。你自己定义的Miguels协议没有任何默认实现,所以编译器会强制你显式实现someF()方法。编译器自动合成实现
部分协议的实现可以由Swift编译器自动合成,无需手动编写代码。比如Sendable协议,只要类型是值类型且所有成员都符合Sendable,编译器会自动合成合规性;Animatable这类协议,若类型的animatableData属性能和自身存储属性对应,编译器也能自动处理。Shape、ShapeStyle这类UI相关协议,Apple和编译器做了适配,让框架内的核心类型能自动满足协议要求。框架内部的隐藏实现
Path和LinearGradient是SwiftUI框架的内部类型,我们能看到的只是公开接口代码。它们的协议要求实现可能写在框架的私有代码里(比如主结构体的内部实现、非公开扩展),只是没有对外暴露。你自己的MiguelStruc是完全自定义的类型,所有代码都在项目内,编译器找不到任何实现协议要求的代码,因此会报错。
给你举个简单的验证例子,要是给自定义协议加默认实现,遵循协议的类型也不用显式写方法:
protocol Miguels { func someF()-> Float } // 给协议添加默认实现 extension Miguels { func someF() -> Float { return 0.0 } } public struct MiguelStruc{ var miguelVar : String = "hey" } extension MiguelStruc: Miguels{ // 这里无需实现someF()也不会报错 }
内容的提问来源于stack exchange,提问作者MiguelG
相关产品推荐
相关产品推荐

