Swift开发报错:'allAnimals'类型无'bull'成员问题咨询
问题分析与解决方案
首先,咱们来拆解下你代码里的核心问题:
allAnimals是结构体而非枚举:你定义的allAnimals是一个包含两个枚举属性的结构体,它本身并没有.bull这类静态成员——.bull是farmAnimals枚举的case,不属于allAnimals,这就是报错Type 'allAnimals' has no member 'bull'的直接原因。- 函数参数与调用完全不匹配:你的
returnAnimalTexture函数要求传入allAnimals类型的实例,但调用时却试图传递一个枚举case,类型完全不对;同时函数内部直接对allAnimals实例做switch判断也行不通,因为结构体本身不是枚举,没法匹配枚举case。
修正方案:统一动物类型为嵌套枚举
最合理的做法是重新设计类型,把所有动物统一到一个枚举中,既保留区域分类,又能让函数轻松处理单个动物参数。示例代码如下:
import SpriteKit // 统一的动物枚举,按区域嵌套子枚举 enum Animal { // 农场动物子枚举 enum Farm { case bull, cat, chicken, cow, duck, drake, goose, horse, mouse, peacock, pig, rooster, sheep } // 海洋动物子枚举 enum Sea { case starfish, oyster, whale } // 顶层case关联不同区域的动物 case farm(Farm) case sea(Sea) } // 修改函数参数为统一的Animal类型 func returnAnimalTexture(for animal: Animal) -> SKTexture { switch animal { case .farm(.bull): return SKTexture(imageNamed: "bull_texture") // 替换为你的实际纹理名称 case .farm(.cat): return SKTexture(imageNamed: "cat_texture") case .sea(.starfish): return SKTexture(imageNamed: "starfish_texture") // 记得补充剩余所有动物case的处理逻辑 default: // 返回默认纹理或处理未覆盖的case return SKTexture() } } // 调用示例:明确指定区域和具体动物 let bullTexture = returnAnimalTexture(for: .farm(.bull)) let starfishTexture = returnAnimalTexture(for: .sea(.starfish))
为什么这样改更合理?
- 这个设计清晰区分了动物的区域分类,同时提供了统一的
Animal类型,让函数可以接收任意区域的动物参数。 - 调用语法直观,
.farm(.bull)明确表示“农场里的公牛”,可读性拉满。 - 避免了原结构体设计中冗余的初始化逻辑——你原本的结构体需要同时传入农场和海洋动物实例,但实际上你只需要单个动物的纹理。
内容的提问来源于stack exchange,提问作者theloneswiftman
相关产品推荐
相关产品推荐

