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

Swift入门:如何在同类扩展的另一方法中获取变量?

解决Swift扩展中私有方法间变量共享的问题

嗨,作为Swift初学者碰到这种变量作用域的问题太常见啦,我来给你几个实用的解决方案:

你的核心问题是:方法A里定义的a和b是局部变量,作用域只局限在方法A内部,所以方法B根本访问不到它们。下面是几种可行的解决思路:

方案1:把变量改成扩展的私有存储/计算属性

如果这两个值需要在扩展的多个方法中复用,可以把它们定义成扩展的私有属性,这样整个扩展里的方法都能访问:

extension FirstViewController {
    // 用计算属性实时获取最新的view尺寸(推荐,适配view尺寸变化的场景)
    private var a: CGFloat { view.frame.size.width }
    private var b: CGFloat { view.frame.size.height }
    
    private func A() {
        // 如果需要缓存固定值,就改成存储属性:
        // private var a: CGFloat = 0
        // private var b: CGFloat = 0
        // 然后在A里赋值:a = view.frame.size.width
    }
    
    private func B() {
        self.Something.frame.size = CGSize(width: a, height: b)
    }
}

小提示:如果view的尺寸可能会动态变化,用计算属性能保证每次拿到的都是最新值;如果只需要缓存一次固定值,就用普通存储属性在A里赋值。

方案2:让方法A传递参数给B

如果a和b只需要在A调用B的场景下使用,可以直接在A里调用B时把这两个值传过去:

extension FirstViewController {
    private func A() {
        let a: CGFloat = view.frame.size.width
        let b: CGFloat = view.frame.size.height
        // 调用B时直接传递参数
        B(withWidth: a, height: b)
    }
    
    // 修改B的方法签名,接收宽高参数
    private func B(withWidth width: CGFloat, height: CGFloat) {
        self.Something.frame.size = CGSize(width: width, height: height)
    }
}

这个方案的好处是变量作用域清晰,不会产生冗余属性,适合一次性传递的场景。

方案3:直接在B中获取view的尺寸(最直接)

其实你会发现,a和b本质就是view的宽高,完全没必要在A里定义,直接在B里获取就行:

extension FirstViewController {
    private func A() {
        // 保留A里的其他逻辑,不需要定义a和b了
    }
    
    private func B() {
        let width = view.frame.size.width
        let height = view.frame.size.height
        self.Something.frame.size = CGSize(width: width, height: height)
    }
}

这是最简单的方案,如果你的方法A里除了定义a和b没有其他逻辑,甚至可以直接去掉A,把逻辑合并到B里。


内容的提问来源于stack exchange,提问作者I am big war hero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:16:05