【Hacker News搬运】用Swift编写Gnome应用程序
-
Title: Writing Gnome Apps with Swift
用Swift编写Gnome应用程序
Text:
Url: https://www.swift.org/blog/adwaita-swift/
标题:使用 Swift 编写 GNOME 应用程序 作者:苹果公司 发布日期:未提供 顶部图片链接:无 文本内容: 2024年3月25日 学生 David 对 Swift 和 GNOME 项目感兴趣。 Swift 由于其简洁的语法、静态类型和特殊特性,非常适合创建用户界面,使代码更易于编写。 结果构建器与 Swift 的闭包表达式语法相结合,可以显著提高代码的可读性。 Adwaita for Swift 利用这些 Swift 特性,为开发 GNOME 平台的应用程序提供了一个直观的界面。 GNOME 是一个流行的、开源的桌面环境,用于 Linux,以其强调简洁性和可访问性而闻名。 它提供了一个直观的用户界面,并且有一个使用其现代 Adwaita 设计语言构建的大量应用程序生态系统。 探索 GNOME 下的应用程序集合。 让我们来看一个使用 Adwaita for Swift 的代码示例。 以下代码片段定义了一个视图,它是窗口内用户界面的一部分。 ```swift struct Counter: View { @State private var count = 0 var body: some View { HStack { Button(icon: .default(icon: .goPrevious)) { count -= 1 } Text("\(count)") .style("title-1") .frame(minWidth: 100) Button(icon: .default(icon: .goNext)) { count += 1 } } } } 视图可以嵌套在其他视图中,或者作为窗口的子视图添加。 它的内容可以从外部修改,并且受其在视图层次结构中的位置影响。 这使得组成视图以产生不同结果变得更容易。 截图显示了一个简单可能的情况。 动机 开发此包的主要动机是启用使用 Swift 编写 GNOME 应用程序,出于上述所有原因。 但还有一些其他原因: 声明式 尽管已经有针对多种现代编程语言的 libadwaita 和 GTK 绑定,包括 Rust、Python 和 JavaScript,但所有官方绑定都遵循命令式编程风格。 这种风格可能冗长且不如声明式风格易读,因为用户界面是通过一系列命令构建的。 以下 Python 代码作为这一情况的示例。 ```python class Counter(Gtk.Box): def __init__(self): Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL, spacing=6) self.count = 0 button_prev = Gtk.Button.new_from_icon_name("go-previous", Gtk.IconSize.BUTTON) button_prev.connect("clicked", self.on_prev_clicked) self.pack_start(button_prev, True, True, 0) self.label = Gtk.Label(label=str(self.count)) self.label.set_name("title-1") self.pack_start(self.label, True, True, 0) button_next = Gtk.Button.new_from_icon_name("go-next", Gtk.IconSize.BUTTON) button_next.connect("clicked", self.on_next_clicked) self.pack_start(button_next, True, True, 0) def on_prev_clicked(self, button): self.count -= 1 self.label.set_text(str(self.count)) def on_next_clicked(self, button): self.count += 1 self.label.set_text(str(self.count))
这个 Python 代码使用了 PyGObject 库,并产生了与上面 Swift 代码相同的用户界面。
易用性
正如你所看到的,Adwaita for Swift 围绕数据构建。
例如,在样本应用程序中单击按钮时,更改变量 count 将自动更新用户界面。
传统的绑定要求您调用持有小部件的对象的函数,以在其内容发生变化时更新小部件。
如果您决定将值存储在磁盘上,以便在应用程序启动之间持久化,您将需要在代码中添加很多复杂性。
Adwaita for Swift 使您可以简单地为应存储的变量添加唯一标识符,其余的由它来处理。@State("count") private var count = 0
还有Localized包的简单且安全的本地化方法。
可读性
简洁的数据中心方法对## Post by: msk-lywenn ### Comments: **w10-1**: For another SwiftUI-like wrapper, see also <a href="https://github.com/stackotter/swift-cross-ui">https://github.com/stackotter/swift-cross-ui</a> (used by Adawaita to generate widgets, and mentioned in other comments).<p>The key premise of this approach is to provide a SwiftUI-like declarative wrapper around Gnome functionality. It's unclear what it adds over swift-cross-ui.<p>SwiftUI itself has growing pains mainly around being on the right thread for processing/updates and getting data binding right.<p>Blog entries on swift.org or from Apple tend to be little demos that show the happy path, but when discussing new frameworks (like a Gnome wrapper) or platforms (like the recent embedded), I'd like more demonstration that the authors understand and address key issues and will sustain development. Cross-platform UI frameworks get complicated quickly and have a long tail of issues (cf Flutter, Java/Eclipse, et al) that can be blockers for clients/users. For Swift it doesn't help to have multiple concurrency models and obviously different behaviors on apple platforms and Linux (where UI is not officially tested). > **w10-1**: 有关另一个类似SwiftUI的包装,请参阅<a href=“https://;/;github.com/!stackoter/:swift cross-ui”>https:///;github.com/;堆叠器;swift-cros-ui</a>(Adawaita用于生成小部件,在其他评论中提到)<p> 这种方法的关键前提是围绕Gnome功能提供类似SwiftUI的声明性包装器。它;s不清楚它在swift cross ui上添加了什么<p> SwiftUI本身也有成长的烦恼,主要围绕着在正确的线程上处理;更新并获得正确的数据绑定<p> swift.org或苹果公司的博客条目往往是展示快乐之路的小演示,但当讨论新的框架(如Gnome包装器)或平台(如最近嵌入的)时;我希望更多地证明作者理解并解决关键问题,并将持续发展。跨平台UI框架很快变得复杂,并有一长串问题(参见Flutter,Java/;Eclipse等),这些问题可能会阻碍客户端/;用户。对于Swift来说;在苹果平台和Linux(UI没有经过正式测试)上拥有多个并发模型和明显不同的行为并没有帮助。 **lukeh**: Other things worth checking:<p><a href="https://github.com/stackotter/swift-cross-ui">https://github.com/stackotter/swift-cross-ui</a> <a href="https://github.com/TokamakUI/Tokamak">https://github.com/TokamakUI/Tokamak</a><p>I’m also working (slowly) on native Flutter channels:<p><a href="https://github.com/PADL/FlutterSwift">https://github.com/PADL/FlutterSwift</a><p>But this is really targeted at embedded use cases. > **lukeh**: 其他值得检查的内容:<p><a href=“https://;/;github.com/!stackoter/:swift cross-ui”>https:///;github.com/;堆叠器;swift cross-ui</a><a href=“https://;/;github.com/!TokamakUI/:Tokamak”>https:///;github.com/;TokamakUI/;Tokamak</a><p>我也在(缓慢地)使用本地Flutter频道:<p><a href=“https://;/;github.com/!PADL/:FlutterSwift”>https:///;github.com/;PADL;FlutterSwift</a><p>但这实际上是针对嵌入式用例的。 **l72**: I recently wrote a small side project using vala + gtk4.<p>I tried blueprint, and while I liked the format, I struggled with a lack of documentation on how to do some more advanced things. Gtk's .ui files are ok, but you still end up writing a lot of code to hook everything up.<p>While I really like vala as a language, I think it'd be great to write all my logic and models in vala, then use this swift library for the UI. > **l72**: 我最近用vala+gtk4写了一个小的附带项目。<p>我尝试了blueprint,虽然我喜欢它的格式,但我很难找到关于如何做一些更高级的事情的文档。Gtk;s.ui文件还可以,但最终还是要编写大量代码来连接所有内容<p> 虽然我真的很喜欢瓦拉作为一种语言,但我认为它;如果能用vala编写我所有的逻辑和模型,然后将这个swift库用于UI,那就太好了。 **YmiYugy**: Has anyone been able to get this running on Mac. Followed the instructions, but I always get a missing adwaita.h in some shim.h > **YmiYugy**: 有人能在Mac上运行这个吗。按照说明操作,但我总是在一些垫片中缺少adwaita.h。h **etaioinshrdlu**: I'm having Deja Vu from about 20 years ago of writing Gnome apps in C# using Mono. > **etaioinshrdlu**: I-;我有大约20年前使用Mono用C#编写Gnome应用程序的Deja Vu。