持续创作,加快生长!这是我参与「日新方案 · 6 月更文挑战」的第25天,点击检查活动概况。

在本章中,你将学会OpaqueTypes不透明类型的运用办法。

前言

Apple官网或者网上分享的教程类文章不同,我将以实践开发视点叙述Swift言语的一些概念和用法,便利咱们更好地学习和掌握Swift言语。

这一起也是对自己学习Swift言语进程的常识整理。

如有过错,以你为准。

项目创建

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

1.png

不透明类型的界说

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

不提供确认类型的回来值,咱们称之为不透明类型。

不透明类型在语法上能够躲藏详细类型,简略来说便是能够不运用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)页")
            }
        }
    }
}

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

3.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
        }
    }
}

3.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()
    }
}

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

快来着手试试吧!

假如本专栏对你有协助,不妨点赞、谈论、重视~