Xcode中为何需SwiftUI.round?如何直接调用round函数?
为什么在Double扩展中必须用SwiftUI.round而不能直接调用round?
问题原因
核心是模块导入规则和命名冲突:
round函数同时存在于两个模块:Foundation模块提供了全局的round(_:)函数,SwiftUI模块也定义了同名的public func round(_: Double) -> Double函数。- 你的代码仅导入了
SwiftUI,虽然SwiftUI依赖Foundation,但Foundation的全局函数不会自动被导入到当前代码作用域,因此编译器找不到Foundation版本的round,只能识别到SwiftUI模块下的同名函数,所以必须加SwiftUI.前缀才能调用。 - 你自定义的
test函数属于当前模块的全局函数,不需要跨模块访问,因此可以直接调用。
解决方案
在代码顶部显式导入Foundation模块,这样就能直接调用Foundation提供的全局round函数,无需添加前缀:
import SwiftUI import Foundation // 新增导入 struct ContentView: View { var body: some View { Text("Hello, world!") .onAppear { let value: Double = 2.69 print(value.string) } } } extension Double { var string: String { let value: Self = round(self*10.0)/10.0 // 现在可直接使用round return String(describing: value) } }
如果不想导入Foundation,也可以直接调用底层Darwin模块的round函数(Foundation的round实际封装了该C函数),写法为Darwin.round(self*10.0),但导入Foundation是Swift项目的常规做法,更推荐前者。
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

