Swift泛型遍历结构体数组报错及协议方法调用优先级咨询
问题解答
1. 遍历数组的报错修复
你代码里的MessagePrinter函数循环逻辑写错了:
func MessagePrinter<T: Foo>(for message: [T]) { // 错误:把传入的一维数组包装成了二维数组,遍历拿到的是数组类型 for message in [message] { message.printMessage() } }
报错原因是[message]会将传入的[T]数组再包裹一层,变成[[T]]二维数组,循环时每次拿到的元素是数组,而数组没有printMessage方法。修正后直接遍历传入的数组即可:
func MessagePrinter<T: Foo>(for messages: [T]) { for item in messages { item.printMessage() } }
2. 方法执行逻辑说明
调用printMessage时,会执行结构体实例中的实现,原因如下:
printMessage是Foo协议明确声明的要求方法,test结构体实现了该方法,这属于对协议要求的自定义实现;- 协议扩展里的
printMessage是默认实现,只有当遵循协议的类型没有实现该方法时,才会触发扩展中的代码。因为你的结构体已经实现了自己的printMessage,所以优先执行结构体里的逻辑。
测试验证:
let testArray = [test()] MessagePrinter(for: testArray) // 输出:Goodbye
内容的提问来源于stack exchange,提问作者srome11
相关产品推荐
相关产品推荐

