为啥 SwiftUI 中的 getter 即使多行也不需要使用 return 关键字?

Posted

技术标签:

【中文标题】为啥 SwiftUI 中的 getter 即使多行也不需要使用 return 关键字?【英文标题】:Why the getter in SwiftUI does not need to use return keyword even if there are more than one line?为什么 SwiftUI 中的 getter 即使多行也不需要使用 return 关键字? 【发布时间】:2021-04-27 12:14:43 【问题描述】:

你能帮我理解下面来自 Apple 的 SwiftUI 教程的代码吗? 我认为“body”变量是一个带有 getter 的计算属性。

据我了解,如果 getter 中有多行,则必须使用 return 关键字返回一个值。为什么下面的代码可以毫无问题地编译?

import SwiftUI

@main
struct LandmarksApp: App 
    @StateObject private var modelData = ModelData()
    
    var body: some Scene 
        let mainWindow = WindowGroup 
            ContentView()
                .environmentObject(modelData)
        
        
        #if os(macOS)
        mainWindow.commands  LandmarkCommands() 
        #else
        mainWindow
        #endif

        #if os(watchOS)
        WKNotificationScene(controller: NotificationController.self, category: "LandmarkNear")
        #endif

        #if os(macOS)
        Settings 
            LandmarkSettings()
        
        #endif
    

【问题讨论】:

【参考方案1】:

嗯,这里有不同的答案。

我想你会在这里找到很多关于 swift ui body/content builder 的详细答案:John Sundell - features that power SwiftUI’s API

为了快速解释,有两种行为在起作用:

类型推断 通过 functionBuilder 或其他方式添加到 SwiftUI 中的糖合成器/语言

类型推断

Swift 是一种静态类型语言,这意味着我们声明的每个属性、常量和变量的类型都需要在编译时指定。然而,这通常不是需要手动完成的事情,而是编译器能够自行计算出范围广泛的类型信息——这要归功于 Swift 支持类型推断这一事实。 John Sundell

Sugar Synthax / 函数构建器

Apple 添加的新语言解决方案,使用泛型和其他技巧扩展编译器。

【讨论】:

以上是关于为啥 SwiftUI 中的 getter 即使多行也不需要使用 return 关键字?的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使发布者发出一个值,我的视图也没有在 SwiftUI 中呈现

SwiftUI 中的多行可编辑文本字段

SwiftUI:VStack 中 ForEach 中的 HStack 使多行文本重叠

SwiftUI for MacOS 中的多行 TextField/TextEditor 表单

为啥我的 SwiftUI 组件有一个圆圈反斜杠?

为啥我不能为 CDTVC 中的私有 UIRefreshControl 属性创建 Getter?