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

如何将ViewController关联Swift文件的数组传递至非视图控制器Swift文件?

嘿,这个问题我之前做项目的时候也碰到过,给你几个实用的解决方案,你可以根据自己的代码场景来选~

方案1:通过初始化方法传递(最直接的方式)

如果numbersTwo.swift里是一个自定义类,你可以给它加一个带参数的初始化器,在创建实例的时候直接把数组传进去:

首先修改numbersTwo.swift:

// numbersTwo.swift
class NumbersTwo {
    var numbersArray: [String] = []
    
    // 定义接收数组的初始化方法
    init(with numbers: [String]) {
        self.numbersArray = numbers
    }
}

然后在你的视图控制器(numbers.swift)里,创建NumbersTwo的实例时传入数组:

// numbers.swift 关联的视图控制器中
let myNumbersTwo = NumbersTwo(with: numbers)
// 此时myNumbersTwo.numbersArray已经替换成["one", "two", "three", "four", "five"]了

方案2:用单例模式实现全局共享

如果这个数组需要在多个地方访问、修改,单例模式会很方便,相当于全局维护一份数组数据:

修改numbersTwo.swift:

// numbersTwo.swift
class NumbersTwo {
    // 全局唯一的单例实例
    static let shared = NumbersTwo()
    var numbersArray: [String] = []
    
    // 私有初始化方法,防止外部创建其他实例
    private init() {}
}

然后在视图控制器里直接赋值:

// numbers.swift 关联的视图控制器中
NumbersTwo.shared.numbersArray = numbers
// 之后在任何地方访问NumbersTwo.shared.numbersArray,拿到的都是你传过去的数组

方案3:通过闭包回调传递

如果NumbersTwo类需要在数组更新时执行一些额外逻辑,闭包回调是个不错的选择:

修改numbersTwo.swift:

// numbersTwo.swift
class NumbersTwo {
    var numbersArray: [String] = []
    // 定义闭包属性,用于接收数组
    var onNumbersUpdate: (([String]) -> Void)?
    
    init() {
        // 绑定闭包逻辑
        onNumbersUpdate = { [weak self] newNumbers in
            guard let self = self else { return }
            self.numbersArray = newNumbers
            // 这里可以加数组更新后的额外操作,比如打印、刷新数据等
            print("数组已更新:\(self.numbersArray)")
        }
    }
}

在视图控制器里触发闭包:

// numbers.swift 关联的视图控制器中
let myNumbersTwo = NumbersTwo()
myNumbersTwo.onNumbersUpdate?(numbers)

方案4:用NotificationCenter实现解耦传递

如果你的视图控制器和NumbersTwo之间没有直接的引用关系,用通知可以实现解耦的传值:

首先在numbersTwo.swift里监听通知:

// numbersTwo.swift
class NumbersTwo {
    var numbersArray: [String] = []
    
    init() {
        // 注册通知监听
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(handleNumbersUpdate(_:)),
            name: NSNotification.Name("UpdateNumbersNotification"),
            object: nil
        )
    }
    
    @objc private func handleNumbersUpdate(_ notification: Notification) {
        // 从通知中取出数组并赋值
        if let newNumbers = notification.object as? [String] {
            numbersArray = newNumbers
        }
    }
    
    // 记得在销毁时移除监听,避免内存泄漏
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

然后在视图控制器里发送通知:

// numbers.swift 关联的视图控制器中
// 发送通知并携带数组数据
NotificationCenter.default.post(
    name: NSNotification.Name("UpdateNumbersNotification"),
    object: numbers
)

小提示

  • 如果只是一次性传值,优先选方案1;
  • 如果需要全局共享数组状态,选方案2;
  • 需要在传值后执行额外逻辑,用方案3;
  • 组件之间没有直接关联、需要解耦时,用方案4。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:33:48