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
相关产品推荐
相关产品推荐

