新手求问, swiftui 的文档应该怎么去阅读理解?救命啊。。

2021-04-17 10:59:23 +08:00
 uswood

提问背景:学习了 swift 语法,但没有实际做 APP 的经验,所以对实际 APP 成型,以及面向对象编程的理解比较模糊,对于文档只阅读过 python 的 beautifulsoup,但感觉和 swiftui 的文档差别很大,swift 的文档真的看不懂,下面我贴了代码和文档的对比,求大神解答,真的 真的要疯了。

如下图:

代码本身的疑问:

第一张图的代码是按照书中教程说的写的,但疑惑很多,从上至下:

1 、struct 结构不是不能继承的吗?为什么会有个 View 在后面。

2 、var body 后面花括号一大段,这个变量是计算变量吗?计算变量不应该是通过计算返回一个值吗。

3 、Text.fontWeight(.thin)该如何理解,我的理解是对 Text 对象的属性 /方法调用,为何里面又有个.thin,这到底是属性还是什么,直接通过点号就能设置属性吗。

4 、Text 对象先用点号调用了 fontWeight,然后直接接着后面又点号调用了 padding(),这个 padding 是在 fontWeight 的基础上调用的吗,padding 应该不属于 fontWeight 吧?他们可以混在一起调用的吗

上图代码与文档结合后,理解文档的疑问:

第二张图,是上图代码调用的 fontWeight 。

1 、首先,这个 Declaration 声明是如何理解的,没看懂要怎么使用;其次,下面全部是常量属性,比如名为 thin 的 Font.Weight (类型?结构?),这又该如何使用。。。

2 、同样的,下图是 TextStyle 的文档,怎么又变成了一个枚举,这个 Declaration 和 case 又是要人怎么用。。。

4507 次点击
所在节点    iDev
46 条回复
secondwtq
2021-04-17 11:02:53 +08:00
楼主可以尝试一下先学 Swift 再学 SwiftUI
lvdb
2021-04-17 11:08:23 +08:00
可以先学一下 react (逃
secondwtq
2021-04-17 11:11:07 +08:00
@lvdb 没用,楼主这情况属于还在用动态类型语言套静态类型语言,至少得 TypeScript
icedwatermelon
2021-04-17 11:34:25 +08:00
.thin 和 Font.Weight.thin 应该是一样的
文档写 Text.fontWeight(Font.weight?) -> Text , padding()是 Text 的 padding()
kingcos
2021-04-17 11:38:43 +08:00
SwiftUI 是声明式 UI,类似上面说的 React 这些新框架。官方的教程还不错,建议先看这个: https://developer.apple.com/tutorials/SwiftUI
文档的话其实靠 IDE 补全就可以,因为声明式 UI 就是这样你只需要声明你想要的样式,他就能自动帮你完成,而不是像命令式,你需要 set 一堆属性等等
hstdt
2021-04-17 11:39:46 +08:00
1. struct 继承问题是 swift 语法,说明 swift 语法还要学学。View 是 Protocol 。
2. 学 SwiftUI 先看 wwdc,比如
https://developer.apple.com/videos/play/wwdc2020/10119/
https://developer.apple.com/videos/play/wwdc2019/204/
3. 官方入门教程 https://developer.apple.com/tutorials/swiftui/

另外 SwiftUI 的文档写的确实不好,很多都是需要有 UIViewController 经验才好理解的概念。
hstdt
2021-04-17 11:44:05 +08:00
https://www.hackingwithswift.com/quick-start/swiftui 对于新手,这里某种程度可能比官方文档更好懂些
onevcat
2021-04-17 11:46:21 +08:00
1. View 是 protocol (协议),ContentView 实现了 View 这个协议。不知道你的技术背景...你可以把 View 理解成 Python 的 Duck typing,Java 或者 C# 的 Interface,Rust 的 Trait 等等..名字不同,基本都是一个东西。参考 https://docs.swift.org/swift-book/LanguageGuide/Protocols.html

2. 是计算变量,或者在 Swift 术语里应该叫计算属性 (computed property)。只有一行的计算属性可以省略 return 。另外,Swift 5.1 以后只有一行的 func 也可以省略 return 。参考 https://useyourloaf.com/blog/swift-5.1-two-quick-tips/

3. Text("") 创建了一个 Text 的实例值,.fontWeight 在这个实例值上调用了一个方法,方法参数是 `.thin`。在 Swift 编译器能够确定类型的情况下,可以省略类型名,直接用 .value 的方式调用。这几行代码写完整的话,等效于

var body: some View {
let plain: Text = Text("Stay hungry, stay foolish.")
let weighted: Text = plain.fontWeight(Font.Weight.thin)
return weighted.padding()
}

4. padding 是在上一个调用的返回值,也是一个 Text 对象上,调用的。但是 padding 本身是定义在 View 上的协议扩展。Text 满足 View 协议,所以也具有 padding 方法。

...

不如重新看一遍 Swift 语法..
minsheng
2021-04-17 12:00:22 +08:00
补充一下 @onevcat,在静态方法,就是说方法 /变量定义在 type (class/struct/enum) 上而不是 type 的 instance (object/value) 上的时候,在类型确定的情况下,可以省略 type name 。
cht
2021-04-17 14:49:14 +08:00
developer.apple.com 的文档确实对刚接触的人不友好,缺少教程式的一步步的指导。但是熟悉以后作为一个 API reference 既简洁,SEO 优化又好,还是很趁手的
uswood
2021-04-17 14:55:22 +08:00
@secondwtq
谢谢,我学了 swift,像各个概念大体都理解,但因为没有真正做过 APP,所以压根不理解怎么用各种类做成 APP,就像帖子说的我只理解类就包含属性和方法,类似模拟自然习惯一样去编写,但真正到了 swiftui 的文档,它只列了一个 Declaration,一些属性,我就看不明白这到底要怎么使用,要按 Declaration 一样去声明吗?属性要怎么用就不清楚了
uswood
2021-04-17 14:55:54 +08:00
@lvdb 不要啊,我怕学了半天语言还没做出个东西,心累~~
uswood
2021-04-17 14:57:33 +08:00
@icedwatermelon 谢谢!所以这个.thin 意思就是这么写,swift 会自动到 Font.Weight 里面去找吗,依靠的是什么,是因为.thin 在 Weight 的括号内这样子对吧
uswood
2021-04-17 14:58:53 +08:00
@kingcos 嗯嗯谢谢有帮助~ 我感觉现在主要是卡壳在很多细节上面了
uswood
2021-04-17 14:59:41 +08:00
@hstdt 原来是协议。。我一直在想 struct 为什么也可以继承。。谢谢有帮助!
lujie2012
2021-04-17 15:01:21 +08:00
建议直接学 swift 语法,然后 UI 开发使用 autolayout UIstackview+uiview+uiscrollview 基本上你可以创造万物了。
我自己的意见是 swiftUI 真的鸡肋,我已经 all in flutter 。
有兴趣的来玩 Flutter 吧,加入前端的世界,早点学习一些 mobx,redux 这些前端状态管理库大佬们,以后你要跨端迟早见见他们。
uswood
2021-04-17 15:13:22 +08:00
@onevcat 谢谢~~这样娓娓道来真的明白了很多,虽然我都阅读了文档,但都是理论化的,所以也还有些没明白的地方:
第一点中的,协议在文档中说的是一个蓝图,就规定遵循这个协议的东西要有它规定的方法、属性,是这样理解对吧?但这里 ContentView 遵循 View 协议,这里的 ContentView 之所以是 ContentView,是因为 View 协议规定了要有这么个 sturct 对吧?

第三点很浅显,看到这里才真的明白了不少,所以这个.thin 意思就是这么写,swift 会自动到 Font.Weight 里面去找吗,依靠的是什么,是因为.thin 在 Weight 的括号内这样子对吧

## 最后其实还是不理解这个文档要怎么读怎么写。。举个例子:
[![c4QB36.png]( https://z3.ax1x.com/2021/04/17/c4QB36.png)]( https://imgtu.com/i/c4QB36)
这里有三个方式,为什么实际上要写 Text.fontWeight 而不是文档中的 Font.Weight / @frozen struct Weight

第二个文档是枚举类,是应该写 Text().TextStyle(case: .body)吗。。
uswood
2021-04-17 15:15:17 +08:00
@minsheng 谢谢!,但没听明白,方法、变量不都是在 type 中定义好了的吗,这里说的意思是不是专指 static method 这种呢?
uswood
2021-04-17 15:16:11 +08:00
@cht1995 你这么一说我再看了一眼确实是的,但对于我这种初学者,没做过实际完整项目的,简直就是细节坑的地狱。。
uswood
2021-04-17 15:18:11 +08:00
@lujie2012 跟着教程做了一个 UIKit 的小 APP,确实比 swiftUI 入门容易得多~Flutter 是一个框架对吧,是否类似于一个 APP 是一个框,内容全部是前端做出来的,然后跨端就只需要换个框就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771241

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX