0
点赞
收藏
分享

微信扫一扫

Swift实用小册22: OpaqueTypes不透明类型的使用

您好 2022-08-29 阅读 27

在本章中,你将学会​​OpaqueTypes​​不透明类型的使用方法。

前言

和​​Apple​​​官网或者网上分享的教程类文章不同,我将以实际开发角度讲述​​Swift​​​语言的一些概念和用法,方便大家更好地学习和掌握​​Swift​​语言。

这同时也是对自己学习​​Swift​​语言过程的知识整理。

如有错误,以你为准。

项目创建

我们新建一个​​SwiftUI​​​项目,命名为​​SwiftUIOpaqueTypes​​。

Swift实用小册22: OpaqueTypes不透明类型的使用_Swift

不透明类型的定义

不透明类型,是对泛型的增强。

不提供确定类型的返回值,我们称之为不透明类型。

不透明类型在语法上可以隐藏具体类型,简单来说就是可以不使用​​class​​​类、​​Struct​​结构体,然后返回我们一种我们需要的类型。

不透明类型的使用

在之前的章节中,我们学习过​​Generics​​泛型的使用,泛型就是一种不确定类型,不透明类型的本质就是不公开的,私有的类型,只根据里面的内容返回具体的类型。示例:

import 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)页")
}
}
}
}

Swift实用小册22: OpaqueTypes不透明类型的使用_iOS_02

上述代码中,是我们之前学过的通过结构体的页面构建方式,这里我们每一个​​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)页")
}
}
}

Swift实用小册22: OpaqueTypes不透明类型的使用_swift_03

上述代码中,我们使用​​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

Swift实用小册22: OpaqueTypes不透明类型的使用_Swift_04

上述代码中,我们仍旧使用不透明类型的方法,创建了一个又一个​​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()
}
}

以上就是本章的全部内容。

快来动手试试吧!

如果本专栏对你有帮助,不妨点赞、评论、关注~

举报

相关推荐

0 条评论