SwiftUI很强大,但是用法过于丰富因此不太好掌握。此篇文章的目的是梳理SwiftUI的设计者想法(框架),整个文章系列记录自己学习/使用SwiftUI的体会和想法。
基本框架:
主函数(入口):
主函数代码如下:
代码语言:javascript复制import SwiftUI
@main
struct SandwichesApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
以“@”开头的声明语词,例如@main,@State 都在向编译器声明该对象的特殊使用。
SwiftUI是核心库。Swift编程的核心概念有两个,包装(Wrapper),修饰(Modifier)。我们可以看到主代码(暂且这样称呼)的包装结构是,APP -> Scene(仅指出协议 protocol,后面会提到。WindowGroup更多的是起到布局的作用,此处先不进行讨论)。在接下来的文件我们会看到,Scene->View->View...等包装结构。其中View直接与内容相关,是最重要的包装。
此处可以看到 some ,这也是一个对编译器的一个声明,表示该对象并不是严格(字面)满足协议,而是允许有一些空间(关于这些特殊声明词,会在后面集中说明),详见:https://juejin.cn/post/6977622916233953294
而基本的内容则放在 ContentView 文件中,使用文件名即可完成对应文件(代码)的调用。
整个Swift的核心在于View的使用。
ContentView(内容所在处):
示例代码如下:
代码语言:javascript复制import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
}
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
View -> some View 结构是 ContentView 文件最常用的框架,基本的内容都在 body 这个变量中。这也意味着 ‘body’ 并不严格(字面)满足协议。这里第一层的 View 更多的是一个抽象概念,与 Scene 相对应,提供一个接口。各种 View 的并列与包装现象也是常见的,因此也延伸出父View(Parent View)等概念。
而 PreviewProvider 协议下的变量(例如这里的ContentView_Previews)更多的是提供对当前文件的预览功能,对于整个App并没有结构性的用处。
常见的包装有:VStack(竖直)、HStack(水平)、ZStack(前后)、List等。
Assets
Assets作为App的资源放置处,App的图标、所有的照片都放置在这里。
例如,我们想要调用Assets的中的一张照片,使用下列的方式即可完成
代码语言:javascript复制Image("myphoto1")
其他的资源也可以通过对应的函数(外接口)来得到。