You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:22:50