Swift中如何在嵌套于Struct的Enum内使用Struct属性
解决Circle结构体嵌套枚举无法访问radius属性的问题
问题描述
我想要创建一个Circle结构体表示圆形,同时定义嵌套的Fraction枚举,通过不同case返回圆形对应位置的坐标。但在枚举的coord计算属性中尝试使用Circle的radius变量时触发报错。
报错信息(翻译后)
错误:类型
Circle的实例成员radius不能用于嵌套类型Circle.Fraction的实例
原代码
public struct Circle { public var radius: Float public init(radius: Float) { self.radius = radius } public enum Fraction { case oneEighths case quarter case half public var coord: (Float, Float) { switch self { /// how to use radius property to replace 150? case .oneEighths: (radius /1.414, radius/1.414) /// if self.radius equals 150, it should return (150/1.414, 150/1.414) case .quarter: (radius, 0) /// if self.radius equals 150 case .half: (0, radius) /// if self.radius equals 150 } } } }
错误原因
嵌套的Fraction枚举是独立于Circle实例的类型,它不属于任何Circle实例的一部分,因此无法直接访问Circle实例的radius属性。
解决方案1:将coord改为接收radius参数的方法
把枚举的coord计算属性改成需要传入radius的方法,使用时传入对应Circle实例的半径即可:
public struct Circle { public var radius: Float public init(radius: Float) { self.radius = radius } public enum Fraction { case oneEighths case quarter case half // 改为接收radius参数的方法 public func coord(with radius: Float) -> (Float, Float) { switch self { case .oneEighths: (radius / 1.414, radius / 1.414) case .quarter: (radius, 0) case .half: (0, radius) } } } } // 使用示例 let circle = Circle(radius: 150) let quarterCoord = Circle.Fraction.quarter.coord(with: circle.radius) // 返回(150, 0)
解决方案2:让Fraction枚举绑定radius关联值
给枚举添加初始化方法,将radius作为关联值存储,让每个枚举实例绑定特定的半径:
public struct Circle { public var radius: Float public init(radius: Float) { self.radius = radius } public enum Fraction { case oneEighths case quarter case half private let radius: Float // 初始化时传入radius init(type: Fraction, radius: Float) { self.radius = radius switch type { case .oneEighths: self = .oneEighths case .quarter: self = .quarter case .half: self = .half } } public var coord: (Float, Float) { switch self { case .oneEighths: (radius / 1.414, radius / 1.414) case .quarter: (radius, 0) case .half: (0, radius) } } } // 给Circle添加便捷方法,快速创建绑定当前radius的Fraction实例 public func fraction(_ type: Fraction) -> Fraction { return Fraction(type: type, radius: self.radius) } } // 使用示例 let circle = Circle(radius: 150) let eighthCoord = circle.fraction(.oneEighths).coord // 返回(150/1.414, 150/1.414)
内容的提问来源于stack exchange,提问作者jacobcan118
相关产品推荐
相关产品推荐

