【问题标题】:Is SwiftUI framework declarative or imperative or neither?SwiftUI 框架是声明式的还是命令式的,或者两者都不是?
【发布时间】:2019-07-06 14:12:18
【问题描述】:

我正在与一位同事讨论,他坚持认为 SwiftUI 是必不可少的。对我来说,这似乎非常具有声明性。他说的对吗?

【问题讨论】:

  • Stack Overflow 不是解决基于意见的争论的地方。就我个人而言,在我的理解中,“命令式”建议使用单独的语句:“制作一个标签。给它这个文本。给它这个颜色。把它放在界面中。”这就是你与 Cocoa / UIKit 交谈的方式。 SwiftUI 说:“这是一个带有这个文本和这个颜色的文本”。这对我来说听起来像是声明性的。

标签: swiftui


【解决方案1】:

正如许多 WWDC 2019 视频(例如,SwiftUI EssentialsIntroducing SwiftUI)中所述,SwiftUI 是声明性的。 Apple 反复将其与传统的命令式方法进行对比。他们的 SwiftUI documentation 的第一行说它是为了“声明你的应用程序的用户界面”。 Apple 的 SwiftUI EssentialsWWDC 2019 视频将 SwiftUI 描述为他们的“新的声明性框架”。

诚然,SwiftUI 也可以与命令式技术结合使用。例如,可以将 SwiftUI 视图与 UIKit 命令式生成的视图/应用程序结合起来。在另一个示例中,当您将点击处理程序添加到视图元素时,您可以巧妙地从声明式编程的“什么”转变为命令式编程的“如何”,因为您概述了完成某些任务要采取的一系列步骤.也许您的同事正在暗示 SwiftUI 的这些方面之一。

但是说 SwiftUI 是一个命令式框架是不准确的。它本质上是声明性的。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    命令式主要关注如何程序正在做某事。在我看来,声明性意味着 SwiftUI 通过其语法清楚地说明 what 正在发生的事情。在 Apple 的 SwiftUI 的 marketing blurb 中,他们展示了一个在我看来非常具有声明性的代码示例。您可以看出,在视图中,您可以定位正文并显示图像,并在正文中垂直堆叠一些文本。我认为它说明 what 没有低级语法,例如:

        @IBOutlet weak var CaptionLabel: UILabel!
    
        @IBAction func Submit(_ sender: Any) {
            CaptionLabel.text = "Hello World"
        }
    

    根据上面的语法,有很多如何工作。您可以看到 @IBAction 向界面生成器声明这是将函数设置为按钮按下的方式。对我来说,这是一种 如何 它是如何工作的,而不是真正的 what 正在发生。在幕后的新 SwiftUI 中,它可能仍然是 @IBAction 和 @IBOutlets,但在我看来,Apple 已经使语法对人类更具声明性,并且不关心我们在幕后发生的事情。我有这种感觉,因为 SwiftUI 是建立在 UIKit 之上的。我使用的衡量标准是,如果语法是人类可读的,并且它抽象了很多关于它如何工作的低级细节,那么它是否更具声明性。

    【讨论】:

    • “我有这种感觉,因为 SwiftUI 是建立在 UIKit 之上的。” (1) 感觉并不构成有效的 Stack Overflow 答案。 (2) SwiftUI“建立在 UIKit 之上”的断言充其量是可疑的,最坏的情况是完全错误的。举个例子,View 是 UIView 或 Text 是 UILabel 并没有简单的意义。更令人信服的是,SwiftUI 的全部要点(或全部要点之一)是它存在于 Mac、iDevice 等;它适用于 UIKit 不存在的地方。
    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2014-03-25
    • 2019-05-29
    • 2017-09-09
    相关资源
    最近更新 更多