Swift中如何在while循环前访问函数外变量及暴露函数内变量?
解答你的Swift二分法变量访问问题
Hey there! Welcome to Stack Overflow—super excited you're getting started with programming and numerical methods. Let's tackle your two questions one by one, nice and slow.
1. 把函数内的m变量暴露到外部更新视图标签
要让函数里的m值能用来更新ViewController的标签,最直接的方式是用闭包(closure)作为回调,每次计算出m的时候,把它传递到函数外面。这样你的ViewController就能拿到实时的m值,立刻更新UI。
举个代码例子,假设你的二分法函数原本是这样的:
func binarySearch(for target: Double, in range: (Double, Double)) { var low = range.0 var high = range.1 while high - low > 0.0001 { // 精度阈值 let m = (low + high) / 2 // 这里是你的方程判断逻辑,比如判断f(m)和目标值的关系 // ... } }
我们可以给函数加一个闭包参数,用来传递m的值:
func binarySearch(for target: Double, in range: (Double, Double), onUpdateM: (Double) -> Void) { var low = range.0 var high = range.1 while high - low > 0.0001 { let m = (low + high) / 2 // 每次算出m,就调用闭包把它传出去 onUpdateM(m) // 你的方程判断逻辑,比如(举个求平方根的例子方程): let fM = m * m - target if fM < 0 { low = m } else { high = m } } }
然后在你的ViewController里调用这个函数,在闭包里更新标签:
class ViewController: UIViewController { @IBOutlet weak var mValueLabel: UILabel! func startBinarySearch() { binarySearch(for: 25.0, in: (0.0, 25.0)) { [weak self] m in // 回到主线程更新UI(数值计算可能在后台线程,UI操作必须在主线程) DispatchQueue.main.async { self?.mValueLabel.text = "当前m值:\(String(format: "%.4f", m))" } } } }
这样每次循环算出m,都会触发闭包更新你的标签啦!注意要用[weak self]避免循环引用哦。
2. 在Swift中,while循环运行前访问函数外的变量
其实这个问题的核心是变量作用域:只要变量定义在函数能访问到的作用域里,不管是while循环之前还是之后,函数都能读取它。
举个简单的例子:
class ViewController: UIViewController { // 定义在ViewController里的外部变量,整个类的方法都能访问 var initialGuess = 10.0 func runBinarySearch() { // 在while循环运行前,直接访问外部变量initialGuess print("循环开始前的初始猜测值:\(initialGuess)") var low = 0.0 var high = 20.0 while high - low > 0.0001 { let m = (low + high) / 2 // ... 你的逻辑 } } }
如果变量是定义在函数的外部(比如全局变量、类的属性,或者函数所在作用域的上层变量),函数内部在while循环执行前就可以直接读取它。只要确保变量的作用域覆盖到这个函数就行~
如果你的变量是在另一个函数里定义的,那就要把它传递到当前函数里,或者通过闭包、属性的方式共享。
内容的提问来源于stack exchange,提问作者Tony Pendleton
相关产品推荐
相关产品推荐

