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

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

前言


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

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

如有错误,以你为准。

项目创建


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


image.png

不透明类型的定义


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

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

不透明类型在语法上可以隐藏具体类型,简单来说就是可以不使用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)页")
            }
        }
    }
}

image.png

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

image.png

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

image.png

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

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

快来动手试试吧!

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

相关文章
|
7月前
|
存储 Swift iOS开发
在Swift编程语言中,集合类型`Set`
在Swift编程语言中,集合类型`Set`
61 2
|
1月前
|
安全 开发工具 Swift
Swift 是苹果公司开发的现代编程语言,具备高效、安全、简洁的特点,支持类型推断、闭包、泛型等特性,广泛应用于苹果各平台及服务器端开发
Swift 是苹果公司开发的现代编程语言,具备高效、安全、简洁的特点,支持类型推断、闭包、泛型等特性,广泛应用于苹果各平台及服务器端开发。基础语法涵盖变量、常量、数据类型、运算符、控制流等,高级特性包括函数、闭包、类、结构体、协议和泛型。
29 2
|
1月前
|
Swift 索引 容器
Swift 泛型-扩展泛型类型
Swift 泛型-扩展泛型类型
29 2
|
1月前
|
Swift 索引
Swift 泛型-类型约束
Swift 泛型-类型约束
26 1
|
1月前
|
安全 Swift iOS开发
Swift 可选(Optionals)类型
10月更文挑战第24天
38 2
|
7月前
|
存储 安全 Swift
【Swift开发专栏】Swift中的集合类型:数组、字典与集合
【4月更文挑战第30天】本文探讨Swift的三种内置集合类型:数组、字典和集合。数组是有序元素集合,支持动态大小调整和类型安全;字典是无序键值对,适用于快速查找;集合是无序不重复元素集合,适合检查元素存在性和集合运算。理解这些特性和用法能提升Swift编程效率。
72 1
|
7月前
|
安全 Swift
【Swift开发专栏】Swift中的可选类型与解包
【4月更文挑战第30天】Swift的可选类型(Optional)用于表示变量可能无值,如用户未填写表单或空服务器数据。可选类型用问号(?)标记,状态可为包含值或nil。解包包括强制解包(!,可能触发运行时错误)、可选绑定(在if/while中安全解包)和隐式解包(声明时带!,使用时不需显式解包)。高级用法包括可选链式调用、空合并操作符(??)和可选类型比较。理解并恰当使用这些概念能提升代码的健壮性和安全性。
72 1
|
7月前
|
安全 Swift
Swift 语言:什么是可选类型(Optional)?如何处理可选类型的安全解包?
Swift的可选类型是处理值可能缺失的类,用?表示。它们能表示有值或无值状态。安全解包用`if let`或`guard let`避免崩溃,而强制解包`!`则风险较高,若值为`nil`会触发运行时错误。
53 0
|
7月前
|
存储 Swift 索引
在 Swift 编程语言中,集合类型 `Set`
在 Swift 编程语言中,集合类型 `Set`
67 1
|
7月前
|
Swift
在Swift编程语言中,有符号整数类型
在Swift编程语言中,有符号整数类型
67 2