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

