100 Days of SwiftUI - Day 25 项目1到3 总结

1.学到了什么

前面我们做了2个SwiftUI项目,还有一个技术性项目。我们学到了一些重要的概念:视图,修饰符,状态,堆栈布局。
我们做了这些:
1.构建一个将文本与控件混合的滚动表单,使用Picker的基于表格的布局,或新的页面选择。
2.NavigationViewpush一个新的View,提供导航栏了标题。
3.使用@State存储要改变的数据,因为SwiftUI都是structs,所以需要使用它。
4.使用$variable来绑定用户界面控件。
5.使用ForEach循环创建大量视图。
6.使用VStack, HStackZStack构建复杂布局。
7.将Color或渐变用作视图,并可以控制他们的大小。
8.使用buton。
9.定义条件,并改变它们的状态来控制弹出alert。
10.SwiftUI怎么使用some View
11.使用三元运算符,创建条件修饰符,来使程序展示不同的结果。
12.创建视图和自定义视图修饰符,分解代码,使我们构建更复杂的程序。

SwiftUI中,Color.red,LinearGradient,VStack,Group,ForEach 全部都是View。所有符合View协议的东西,都可以返回给body。
View协议是SwiftUI的核心。
在其它框架中,通常用类才实现,这意味着,如果继承自UIView,你将获得200多种不需要的属性和方法,以及大量的其它功能。
而在SwiftUI中,只需要在body添加一个符合View协议的东西,SwiftUI就知道如何布局。这就是面向协议编程的重要的原因。
像Text , Image, Color, Spacer。我们构建的UI在这些上面创建。


2.关键点

结构体与类

五个区别
1.类不带有成员初始化器,结构体默认有。
2.类可以使用继承来构建功能,而结构体不能。
3.复制一个类时,副本指向相同的数据。而结构体的副本是唯一的。
4.类具有反初始化器,结构体没有。
5.常量类中可以更改变量属性。常量结构体内部的属性是固定的,无论是变量或常量。

在Objective-C中,几乎所有类型都用到了类。
而在Swift中,我们可以选择class 或 struct,但是不少人在使用时,确不考虑选择class或struct的后果。
使用结构体还是类取决于你所解决的问题。重点是,当有人读取你的代码时,你的意图清晰了吗。
例如你大多数使用结构体,那么特定的地方切换到类时,可以传达一些意图:这件事与众不同,需要以不同的方式对待。
而在SwiftUI中,UI使用结构体,数据使用类。

ForEach

ForEach(0 ..< 100) { number in
    Text("Row \(number)")
}

ForEach是一个视图。它允许我们绕过添加十个子视图的限制。

let agents = ["Cyril", "Lana", "Pam", "Sterling"]
VStack {
    ForEach(0 ..< agents.count) {
        Text(self.agents[$0])
    }
}

前面我们这样写,
在循环时,Swift会确定每个项目是唯一的。
但ForEach提供了第二种方式,我们可以在数组上循环。然后直接使用。

VStack {
    ForEach(agents, id: \.self) {
        Text($0)
    }
}

绑定

当使用如Picker或其他控件时,我可以将其双向绑定到 @State的属性,简单的属性非常有用,有时(很少)你还需要更高级的功能,使用自定义绑定来运行一些逻辑。

struct ContentView: View {
    @State var selection = 0

    var body: some View {
        let binding = Binding(
            get: { self.selection },
            set: { self.selection = $0 }
        )
        return VStack {
            Picker("Select a number", selection: binding) {
                ForEach(0 ..< 3) {
                    Text("Item \($0)")
                }
            }.pickerStyle(SegmentedPickerStyle())
        }
    }
}

使用自定义绑定,实现一个按钮控制其它三个。


自定义绑定效果图
struct ContentView: View {
    
    @State var agreedToTerms = false
    @State var agreedToPrivacyPolicy = false
    @State var agreedToEmails = false

    var body: some View {
        
        let agreeToAll = Binding (
            get: {
                agreedToTerms && agreedToPrivacyPolicy && agreedToEmails
            },
            set: {
                agreedToTerms = $0
                agreedToPrivacyPolicy = $0
                agreedToEmails = $0
            }
        )

        VStack {
            
            Toggle(isOn: $agreedToTerms) {
                Text("Agree to Terms")
            }
            
            Toggle(isOn: $agreedToPrivacyPolicy) {
                Text("Agree to PrivacyPolicy")
            }
            
            Toggle(isOn: $agreedToEmails) {
                Text("Agree to Emails")
            }
            
            Toggle(isOn: agreeToAll) {
                Text("Agree to All")
            }
        }
    }
}

自定义绑定并不常用,但了解背后的操作非常重要。


3.挑战项目

挑战是制作一款大脑训练游戏,石头,纸,剪刀上的游戏
大致来说:
游戏每回合,应用程序都会随机选择石头,纸或剪刀。
该应用程序每次旋转都会提示玩家获胜或失败。
然后,玩家必须轻按正确的招式来赢得或输掉游戏。
如果他们是正确的,他们得分。否则他们会失去一点。
游戏在10个问题之后结束,此时将显示其得分。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335