如何在Swift结构体的init方法中调用函数避免初始化错误?
解决Swift结构体init中调用实例方法的初始化错误
你遇到的'self' used before all stored properties are initialized错误,本质是实例方法必须等结构体所有存储属性都初始化完成后才能调用——在你当前的init里,给value赋值时,self还没完全初始化(因为value还没赋值完毕),所以没法调用实例方法calculateValue。
要解决这个问题,同时保留函数的可复用性,最直接的方案是把calculateValue改成静态方法(用static修饰),这样它属于Card类型本身,不需要依赖实例self就能调用:
struct Card { let face: Face let suit: Suit let value: Int init(face: Face, suit: Suit) { self.face = face self.suit = suit // 直接通过类型调用静态方法,不需要self self.value = Card.calculateValue(face: face) } // 用static修饰,变成类型方法 private static func calculateValue(face: Face) -> Int { switch face { case .two: return 2 case .three: return 3 case .four: return 4 case .five: return 5 case .six: return 6 case .seven: return 7 case .eight: return 8 case .nine: return 9 default: return 10 } } // 其他实例方法中调用时,可用Self或类型名直接调用 func someInstanceMethod() { let val = Self.calculateValue(face: self.face) // ... } }
我把原代码里的多个if改成了switch,代码更简洁,逻辑和原代码完全一致。之后在结构体的其他实例方法里需要调用这个函数时,直接用Self.calculateValue或者Card.calculateValue即可,依然能保持复用性。
内容的提问来源于stack exchange,提问作者Charklewis
相关产品推荐
相关产品推荐

