草庐IT

SwiftUI教程(一)SwiftUI的认识

iOS之文一 2023-03-28 原文

SwiftUI教程系列文章汇总

本文主要认识SwiftUI,并且学会如何使用SwiftUI。

主要内容:

  1. 什么是SwiftUI
  2. 创建的第一个SwiftUI工程
  3. SwiftUI的简单使用

1. 什么是SwiftUI

2019年WWDC大会上,苹果在压轴环节向大众宣布了基于Swift语言构建的全新UI框架——SwiftUI,开发者可通过它快速为所有的Apple平台创建美观、动态的应用程序。

SwiftUI的运行速度优于UIKit,他减少了界面的层次结构,因此可以减少绘制步骤,并且他完全绕过了CoreAnimation,直接进入Metal,可以有优秀的渲染性能。

1.1 认识

SwiftUI is a user interface toolkit that lets us design apps in a declarative way.
SwiftUI 就是⼀种声明式的构建界面的用户接口工具包。

SwiftUI使用声明式的语法构建UI,我们只需要向系统声明UI的View样式,以及View如何转换状态,其他的过程都交给系统去处理。

声明式语法和指令式语法的区别:

  1. 声明式的我们需要提前声明好每个view的各种状态,以及状态转变的条件。后续界面和用户在互动时,系统会帮我们自动进行状态切换。
  2. 指令式的我们需要给每个view先设置好默认状态,后续界面和用户在互动时,需要通过指令不停的去转变view的状态
  3. 因此声明式的UI是提前声明好各种状态,系统会自动帮我们进行状态切换。指令式的UI是通过我们设定的指令来转换状态
  4. 比如界面调整、用户交互、机型适配,UIKit都需要手动调整view,对于SwiftUI我们只需要声明好我们想要的样式,系统会帮我们去调整view。
  5. 可以这么说,SwiftUI相比于UIKit更加的抽象化了

1.2 优点

  • 统一苹果终端
    • 在 SwiftUI 出现之前,苹果不同的设备之前的开发框架并不互通,增加开发者所需消耗的时间精力,也不利于构建跨平台的软件体验
    • SwiftUI具有了跨平台性,苹果的平台都可以使用,iOS、macOS、tvOS、watchOS
  • 降低界面开发难度
    • UIKit 的基本思想要求ViewController 承担绝⼤部分职责,它需要协调 model,view 以及⽤⼾交互。这带来了巨⼤的sideeffect 以及⼤量的状态
    • SwiftUI是声明式的构建方式,我们只需要声明好界面系统会自动转换状态,搭建界面更加的简单
  • 更加高效
    • 默认使用Metal渲染,性能非常高,比UIKit要好
    • 更扁平化的内联数据结构去分配内存,值类型。占用内存很少(所以在轻应用的开发更适合使用SwiftUI)
    • 代码量相比UIKit要更少,效率更高
  • 更好的配合Swift语言
    • SwiftUI 使用了大量 Swift 的语言特性

1.3 特点

  1. 声明式语法
    1. 与UIKit布局相比,更加的抽象化,只需要向系统声明界面样式以及样式变化条件,其他的系统会帮我们实现,不需要我们自己去调整视图
  2. 链式调用属性
    1. 链式调用是 Swift 语言的一种特性,就是使用函数式编程,可以像链条那样不断地调用函数,中间不需要断开。使用这种方式可以大大减少代码量。
    2. 除了系统提供的属性可以使用之外,开发者也可以进行自定义
    3. 例如将不同字体、字号、行间距、颜色等属性统合起来,可以组合成为一个叫「标题」的文字属性。之后凡是需要将某一行文字设置成标题,直接添加这个自定义的属性即可,使用这种方式进行开发无疑能够极大的避免无意义的重复工作,更快的搭建应用界面框架。
  3. 界面元素的组件化
    1. UIKit耦合了很多的操作逻辑,很难进行移植,更遑论组件化了
    2. 而SwiftUI仅仅声明界面样式,所以是可以将复杂视图的拆分出来组件化
    3. 甚至还可以在其他平台使用,以此跨平台
    4. 一般我个人会将视图组件区分为基础组件、布局组件和功能组件
  4. 与UIKit互相兼容
    1. 把 UIKit 中已有的部分进行封装,提供给 SwiftUI 使用。开发者需要做的仅仅是遵循UIViewRepresentable协议即可
    2. 并且在已有的项目中,也可以仅用 SwiftUI 制作一部分的 UI 界面
    3. 两种代码的风格是截然不同的,但在使用上却基本没有性能的损失。在最终的运行效果上,用户也无法分辨出两种界面框架的不同。
  5. 真实数据源(Source of truth)(重点)
    1. SwiftUI中的数据源一定会是真实的,也就是准确的
    2. 在OC中,一个view的状态由多种因素导致的,不同的来源,不同的逻辑操作(因此需要考虑及时更新界面)
    3. 因此在Swift中,提供了单一数据源的说法
      1. 只要在属性声明时加上 @State 等关键词,就可以将该属性和界面元素联系起来,在每次数据改动后,都有机会决定是否更新视图。
      2. 系统将所有的属性都集中到一起进行管理和计算,也不再需要手写刷新的逻辑。
      3. 因为在 SwiftUI 中,页面渲染前会将开发者描述的界面状态储存为结构体,更新界面就是将之前状态的结构体销毁,然后生成新的状态。
      4. 而在绘制界面的过程中,会自动比较视图中各个属性是否有变化,如果发生变化,便会更新对应的视图,避免全局绘制和资源浪费。
    4. 使用这种方式,读和写都集中在一处,开发者就能够更好地设计数据结构,比较方便的增减类型和排查问题。而不用再考虑线程、原子状态、寻找最新数据等各种细节,再决定通知相关的界面进行刷新。
  6. 设计工具和快速预览功能
    1. Xcode 包含直观的设计工具,只需拖放操作就能使用 SwiftUI 轻松构建界面。
    2. 拖放操作
    3. 动态替换
    4. 预览

1.4 SwiftUI和UIKit的区别

  • SwiftUI是描述式的(声明式的),UIKit是指令式的
  • UIKit的View都是一个Class,SwiftUI的View是Struct
    • Swift的View不需要像UIKit那样操作逻辑控制,只负责展示
    • 因为结构体比类更简单更轻量,创建几乎没有开销
  • Swift的运行速度要优于UIKit
  • Swift的开发难度要低于UIKit

2. 创建的第一个SwiftUI工程

2.1 创建SwiftUI工程

创建过程和之前一样,只不过这里要选择Swift语言和SwiftUI

创建工程

查看界面如下:


UI界面

2.2 SwiftUIAPP代码解析

代码:

import SwiftUI

@main
struct TodoSwiftUIApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

说明:

  • 这个结构体就是一个APP,继承自APP
  • 定义了一个body属性,拿到APP的窗口
  • 这里调用ContentView就是我们定义的View
  • 所以这里就是拿到我们创建的APP的UI

2.3 ContentView结构体解析

代码:

import SwiftUI
struct ContentView: View { 
    var body: some View { 
        Text("Hello, world!") .padding() 
        } 
    }

说明:

  1. 结构体ContentView定义了屏幕的UI,遵守View协议
  2. 所有在SwiftUI中显示的元素都需要遵守View协议
  3. 因此,必须声明一个叫做body的属性,这个body可以返回整理好的View,详情可以看博客Swift基础语法(十一)泛型
  4. some是不透明类型,不透明在于不知道返回的具体类型是什么,只知道遵守View协议
  5. 当前body内只包含了一个Text视图,文本视图是图形化的,显示一行或多行只读文本的视图,也就是说他是一个文本标签(先简单的看做是OC中的Label,后续文章会详细介绍SwiftUI中的View)

2.4 预览认识

代码:

struct ContentView_Previews: PreviewProvider { 
    static var previews: some View { 
        ContentView()
    } 
}

说明:

  1. UI的预览结构体,遵守PreviewProvider协议
  2. 定义了一个previews变量。它拿到的也是ContentView(),即UI
  3. 它可以修改我们的预览属性

比如我们想要在iPhone SE上进行预览,需要进行如下操作:

 struct ContentView_Previews: PreviewProvider { 
    static var previews: some View { 
        ContentView(). previewDevice("iPhone SE (2nd generation)") 
    } 
}

通过这种方式就可以查看不同机型下的预览

预览画面查看

预览画面

说明:

  1. 可以在这里选择打开或关闭预览界面
  2. 在预览设置中,共有六项
    1. Preview是刷新视图
    2. 运行预览
    3. 发快递
    4. 切换横竖屏
    5. 设置预览配置
    6. 新增预览界面
  3. 预览配置
  4. 调节预览尺寸

3. SwiftUI的简单使用

代码:

struct ContentView: View {
    var body: some View {
        VStack(alignment: .center, spacing: 20){
            Text("Hello")
                .foregroundColor(.red)
            Button(action:{
                print("button tapped")
            }){
                Text("Press Me")
            }
            .foregroundColor(.green)
        }
    }
}

说明:

  1. 所有视图代码都放在body中
  2. VStack是进行垂直布局,alignment表示对齐方式,这里是居中对齐,还有spacing表示内间距,为20
  3. Text是文本视图
  4. Button是按钮,action是点击后的操作,Text("Press Me")是按钮文本
  5. foregroundColor是Modeifiers,后续会详细讲解

结果:

结果

有关SwiftUI教程(一)SwiftUI的认识的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  3. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  4. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  5. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  6. ruby-on-rails - rails 教程 : Putting flash messages in partial yields error "undefined method ` each' for nil:NilClass"? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FlashMessagesinPartials(Rails3)我正在做MichaelHartl的Railstutorial和listing7.26将flash消息添加到应用程序布局:...">...这很好用。但是,我试图通过在我的部分文件夹中创建一个_flash.html.erb来清理这段代码...">-->...并且比使用......在我的应用程序布局中,我的所有Rspec测试开始失败,每个测试都显示以下消息:Failure/Error:before{visitsignup_path}ActionView:

  7. ruby-on-rails - Ruby on Rails 教程 - 5.26 - Sublime Text "Unable to Save"新文件 "spec/support/utilities.rb" - 2

    我正在使用SublimeText2,同时遵循MichaelHartl的RubyonRails教程。可以在http://ruby.railstutorial.org/book/ruby-on-rails-tutorial找到我所指的教程的具体部分。(ctrl+F“list5.26”)。我能够创建规范/支持文件。但是,在尝试创建spec/support/utilities.rb文件时,我收到消息“无法保存~/rails_projects/sample_app/spec/support/utilities.rb”。有人知道为什么会这样吗?SublimeText论坛上有人似乎遇到了完全相同的问

  8. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

  9. 【云计算】私有云在VMware下虚拟机的创建与配置(图文教程) - 2

    【适用平台】私有云   说明:完成私有云部分是需要两台虚拟机的,分别为controller、compute两个节点,但我们只需配置一台,然后克隆就方便多啦!需要用到的映射文件:关于vm的安装我就不介绍的,毕竟挺简单的,下面让我们看看基于私有云模块中,虚拟机的搭建吧。1、创建新的虚拟机,这里一般我会选择自定义,毕竟后面的配置都要根据私有云相关来进行搭建,会比较复杂。(如果是基础的可以选择典型,典型的满足一般虚拟机的配置) 2、选择稍后安装操作系统会比较方便后续的选择,这里你也可以自己选择自己的映像文件(但不建议)  3、我们是基于Linux下操作的,所以选择Linux客户机操作系统,版本选择自己

  10. 关于如何为 PostgreSQL 编写存储过程的 Ruby 教程? - 2

    听说PostgreSQL的可以用Ruby写存储过程但我一直没能找到更多关于它的信息,教人们如何实际去做。有人可以为此推荐好的资源。谢谢 最佳答案 显然,您需要安装PL/Ruby。之后,你可以写:CREATEFUNCTIONruby_max(int4,int4)RETURNSint4AS'ifargs[0].to_i>args[1].to_ireturnargs[0]elsereturnargs[1]end'LANGUAGE'plruby';查看其GitHubrepository安装说明。

随机推荐