前言
和Apple
官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift
语言的一些概念和用法,方便大家更好地学习和掌握Swift
语言。
这同时也是对自己学习Swift
语言过程的知识整理。
如有错误,以你为准。
项目创建
我们新建一个SwiftUI
项目,命名为SwiftUIOpaqueTypes
。
不透明类型的定义
不透明类型,是对泛型的增强。
不提供确定类型的返回值,我们称之为不透明类型。
不透明类型在语法上可以隐藏具体类型,简单来说就是可以不使用class
类、Struct
结构体,然后返回我们一种我们需要的类型。
不透明类型的使用
在之前的章节中,我们学习过Generics
泛型的使用,泛型就是一种不确定类型,不透明类型的本质就是不公开的,私有的类型,只根据里面的内容返回具体的类型。示例:
mport SwiftUI struct ContentView: View { var body: some View { VStack { titleView() ListView() } } } struct titleView: View { var body: some View { Text("首页") } } struct ListView: View { var body: some View { List { ForEach(1 ... 4, id: \.self) { index in Text("第 \(index)页") } } } }
上述代码中,是我们之前学过的通过结构体的页面构建方式,这里我们每一个View
都是确定的类型,也就是Struct
结构体。
Struct
结构体是公开的、确定的类型。
在Swift
开发过程中,我们除了class
类、Struct
结构体,也可以使用some
关键字加我们需要返回的内容,构建返回结果。示例:
import SwiftUI struct ContentView: View { var body: some View { VStack { titleView ListView } } } private var titleView: some View { Text("首页") } private var ListView: some View { List { ForEach(1 ... 4, id: \.self) { index in Text("第 \(index)页") } } }
上述代码中,我们使用some
关键字返回了一个View
的视图,它是一个不透明类型的结果。
SwiftUI
的一大特点是高度可组合,View
的唯一属性body
是另一个满足View
约束的具体View
类型。
我们看到了组合以及递归两个特性,这里使用了不透明返回类型的特性,对外隐藏了具体类型VStack
。
不透明类型的实例
我们可以使用不透明类型的方法,达到简化代码的目的,也就无需定义很多单独的Struct
结构体完成页面样式。示例:
import SwiftUI struct ContentView: View { var body: some View { NavigationView { Form { Section { toOurSiteView toPrivacyPolicyView toUserAgreementView } Section { toAppstoreView toFeedbackView toAboutView } } .navigationBarTitle("设置", displayMode: .inline) .navigationBarItems(leading: backToMineView) } // 显示分割线 .onAppear { UITableView.appearance().separatorColor = .systemGray4 } } }
上述代码中,我们仍旧使用不透明类型的方法,创建了一个又一个View
,然后在ContentView
结构体中,我们使用这些OpaqueTypes
不透明类型的View
,既能隐藏返回类型,也避免了返回类型很长的问题。
这就是some
的关键字作用,用在当返回值为不确定类型的情况。
本章代码
import SwiftUI struct ContentView: View { var body: some View { NavigationView { Form { Section { toOurSiteView toPrivacyPolicyView toUserAgreementView } Section { toAppstoreView toFeedbackView toAboutView } } .navigationBarTitle("设置", displayMode: .inline) .navigationBarItems(leading: backToMineView) } // 显示分割线 .onAppear { UITableView.appearance().separatorColor = .systemGray4 } } } // MARK: - 返回 private var backToMineView: some View { Button(action: { // 返回上一页 }) { Image(systemName: "arrow.backward.circle.fill") .foregroundColor(Color.gray) } } // MARK: - 访问官网 private var toOurSiteView: some View { Button(action: { // 跳转官网 }) { HStack { Text("访问官网") .foregroundColor(Color.gray) Spacer() Image(systemName: "chevron.right") .foregroundColor(.gray) } } } // MARK: - 前往隐私政策页面 private var toPrivacyPolicyView: some View { Button(action: { // 进入隐私政策页面 }) { HStack { Text("隐私政策") .foregroundColor(Color.gray) Spacer() Image(systemName: "chevron.right") .foregroundColor(.gray) } } } // MARK: - 前往用户协议页面 private var toUserAgreementView: some View { Button(action: { // 进入用户协议页面 }) { HStack { Text("用户协议") .foregroundColor(Color.gray) Spacer() Image(systemName: "chevron.right") .foregroundColor(.gray) } } } // MARK: - 前往Appstore评分页面 private var toAppstoreView: some View { Button(action: { // 前往Appstore评分页面 }) { HStack { Text("前往Appstore") .foregroundColor(Color.gray) Spacer() Image(systemName: "chevron.right") .foregroundColor(.gray) } } } // MARK: - 前往帮助反馈页面 private var toFeedbackView: some View { Button(action: { // 前往帮助反馈页面 }) { HStack { Text("用户反馈") .foregroundColor(Color.gray) Spacer() Image(systemName: "chevron.right") .foregroundColor(.gray) } } } // MARK: - 前往关于页面 private var toAboutView: some View { Button(action: { // 前往关于页面 }) { HStack { Text("关于我们") .foregroundColor(Color.gray) Spacer() Image(systemName: "chevron.right") .foregroundColor(.gray) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
以上就是本章的全部内容。
快来动手试试吧!
如果本专栏对你有帮助,不妨点赞、评论、关注~