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

Swift与Java OOP差异解惑:SwiftUI全局变量与函数疑问

Swift 入门常见疑问解答(Java背景视角)

先看教程中的ModelData.swift代码:

import Foundation

var landmarks : [Landmark] = load("landmarkData.json")

func load<T: Decodable>(_ filename :String) -> T {
    let data: Data
    
    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
    else
    {
        fatalError("where is my \(filename)?")
    }
    
    do{
        data = try Data(contentsOf: file)
    }
    catch
    {
        fatalError("Problem loading this \(filename)")
    }
    
    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    }
    catch
    {
        fatalError("This file: \(filename) did not parse to type")
    }
}

疑问1:Swift是否并非严格面向对象语言?

Swift是多范式编程语言,既支持面向对象编程(OOP),也兼容函数式、过程式编程风格。和Java要求所有代码必须包裹在类/接口中的规则不同,Swift允许在文件的顶层直接定义全局变量、全局函数、枚举、结构体等成员,这些成员属于全局作用域。

教程里的landmarks全局变量和load全局函数就是这种写法,但这并不意味着Swift放弃了OOP特性——它依然具备类、继承、多态、封装等核心OOP能力,只是语法上更灵活,不需要强制用类来包裹所有代码。

疑问2:landmarks数组的填充时机是什么?

Swift的全局变量采用懒加载机制,也就是它的初始化代码(这里的load("landmarkData.json")调用)不会在APP启动时立即执行,而是在第一次被代码访问的时候才会触发。

举个例子,当教程中第一次出现landmarks[0]这样的调用时,load函数才会被执行,加载JSON文件并完成数组的填充。这和Java中静态变量在类加载时初始化的逻辑不同,Swift全局变量的初始化时机更晚,是按需触发的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:50:12