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

Swift中如何在函数执行特定逻辑后终止后续代码运行?

Swift单例共享场景下的函数执行控制方案

问题说明

现有两个类共享MyClassA单例,当前MyClassB的work1方法中,遍历数组找到匹配项时会调用MyClassA.shared.work2(true),但后续仍会执行work2(false),导致同时传入true和false,不符合"仅执行其中一个操作后终止"的需求。

解决方案

方案一:本地标记变量(推荐)

通过在work1方法内新增本地布尔变量,记录是否已发送true值,以此控制后续逻辑是否执行:

class MyClassA {
    static let shared: MyClassA = MyClassA()
    var hasValue2: Bool = Bool()
    
    func work2(value: Bool) {
        hasValue2 = value
        print(value)
    }
}

class MyClassB {
    static let shared: MyClassB = MyClassB()
    private let array: [Int] = [0, 1, 2, 3, 4]
    
    func work1() {
        var sentTrue = false
        
        for item in array {
            if item == 2 {
                MyClassA.shared.work2(value: true)
                sentTrue = true
                break
            }
        }
        
        // 仅当未发送过true时,才执行false的调用
        if !sentTrue {
            MyClassA.shared.work2(value: false)
        }
    }
}

// 使用场景
func startWork() {
    MyClassB.shared.work1()
}

逻辑说明:本地变量sentTrue仅在当前work1执行周期内有效,不受外部对MyClassA属性的修改影响,能确保逻辑可靠性。遍历找到匹配项时,标记sentTrue为true并跳出循环;后续通过判断该标记,决定是否执行false的调用,保证两种操作只会触发一次。

方案二:依赖单例属性(单线程场景适用)

如果确定MyClassA的hasValue2属性不会被外部线程修改,也可以直接通过该属性判断:

class MyClassB {
    static let shared: MyClassB = MyClassB()
    private let array: [Int] = [0, 1, 2, 3, 4]
    
    func work1() {
        for item in array {
            if item == 2 {
                MyClassA.shared.work2(value: true)
                break
            }
        }
        
        // 检查单例属性,未设置true则执行false调用
        if !MyClassA.shared.hasValue2 {
            MyClassA.shared.work2(value: false)
        }
    }
}

注意事项:若存在多线程场景,其他线程可能在遍历结束后、判断前修改hasValue2,导致逻辑出错,因此仅推荐在单线程环境下使用。

内容的提问来源于stack exchange,提问作者swiftPunk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:05:37