Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Swift代码中的嵌套命名法

Swift代码中的嵌套命名法

作者头像
莫空9081
发布于 2021-03-01 04:42:52
发布于 2021-03-01 04:42:52
1.8K00
代码可运行
举报
文章被收录于专栏:iOS 备忘录iOS 备忘录
运行总次数:0
代码可运行

Swift代码中的嵌套命名法

Swift支持与其他类型嵌套命名,尽管它还没有专用的命名关键词。下面我们来看看,如何使用类型嵌套来优化我们代码的结构。

大多数Swift开发者习惯于用类型在结构上的实际名字累命名。例如:PostTextFormatterOption(一个Text Formatter类型的用于format Posts的Option)。这可能是因为我们在Objective-C & C中,养成的别无选择的可怕命名习惯,被我们带到了Swift里。

下面我们用上面提到的类型作为例子,来看下Post、PostTextFormatter以及PostTextFormatterOption的实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Post {
    let id: Int
    let author: User
    let title: String
    let text: String
}

class PostTextFormatter {
    private let options: Set
    
    init(options: Set) {
        self.options = options
    }

    func formatTitle(for post: Post) -> String {
        return post.title.formatted(withOptions: options)
    }

    func formatText(for post: Post) -> String {
        return post.text.formatted(withOptions: options)
    }
}

enum PostTextFormatterOption {
    case highlightNames
    case highlightLinks
}

然后我们再来看一下,如果我们把上面的类型作为Post的嵌套类型,会发生什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Post {
    class TextFormatter {
        enum Option {
            case highlightNames
            case highlightLinks
        }

        private let options: Set

        init(options: Set) {
            self.options = options
        }

        func formatTitle(for post: Post) -> String {
            return post.title.formatted(withOptions: options)
        }

        func formatText(for post: Post) -> String {
            return post.text.formatted(withOptions: options)
        }
    }

    let id: Int
    let author: User
    let title: String
    let text: String
}

上面嵌套类型的一个很大的优点是,我们扫一眼就可以很明白的看到类型之间的的结构和关系。而且我们还减少了初始化代码的冗长,使它更短更易阅读(options参数类型从Set< PostTextFormatterOption >变为Set< Option >)。

调用层级也更加简洁明了——所有和Post有关的整洁的变为Post.namespace。一个post的文本的格式化看起来如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let formatter = Post.TextFormatter(options: [.highlightLinks])
let text = formatter.formatText(for: post)

然而,使用嵌套类型还有一个不容忽视的坏处。代码看起来“反了”,因为父类型的实际内容被挤到了最下面。我们试着来修复一下这个问题,把嵌套类型的代码从上面移到下面(为了好分辨,还添加一些MARKs)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Post {
    let id: Int
    let author: User
    let title: String
    let text: String

    // MARK: - TextFormatter
    class TextFormatter {
        private let options: Set

        init(options: Set) {
            self.options = options
        }

        func formatTitle(for post: Post) -> String {
            return post.title.formatted(withOptions: options)
        }

        func formatText(for post: Post) -> String {
            return post.text.formatted(withOptions: options)
        }

        // MARK: - Option
        enum Option {
            case highlightNames
            case highlightLinks
        }
    }
}

嵌套类型放上面还是下面纯粹是个人偏好。我比较喜欢把父类型的内容放在上面————同时还可以享受嵌套类型的便利。

事实上,在Swift中还有好几种其他方法可以实现命名、嵌套类型。

使用extension实现嵌套类型

另一个实现嵌套类型的选择就是extension。这种方法可以在实现和调用时保持层级关系,同时清楚明白的分开每种类型。

看起来如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Post {
    let id: Int
    let author: User
    let title: String
    let text: String
}

extension Post {
    class TextFormatter {
        private let options: Set

        init(options: Set) {
            self.options = options
        }

        func formatTitle(for post: Post) -> String {
            return post.title.formatted(withOptions: options)
        }

        func formatText(for post: Post) -> String {
            return post.text.formatted(withOptions: options)
        }
    }
}

extension Post.TextFormatter {
    enum Option {
        case highlightNames
        case highlightLinks
    }
}

使用typealiases

也可以使用typealiases。在原始代码里添加typealiases来实现类似嵌套类型的代码(实际上并没用嵌套类型)。尽管这种方法在实现上并没有嵌套层级关系,但是却减少了冗长代码————并且调用看起来也和使用嵌套类型一样。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Post {
    typealias TextFormatter = PostTextFormatter

    let id: Int
    let author: User
    let title: String
    let text: String
}

class PostTextFormatter {
    typealias Option = PostTextFormatterOption

    private let options: Set

    init(options: Set) {
        self.options = options
    }

    func formatTitle(for post: Post) -> String {
        return post.title.formatted(withOptions: options)
    }

    func formatText(for post: Post) -> String {
        return post.text.formatted(withOptions: options)
    }
}

enum PostTextFormatterOption {
    case highlightNames
    case highlightLinks
}

最后

使用嵌套类型有助于写出优雅结构、层级的代码,使多种类型之间的关系更加清楚明了————不管是在实现上,还是调用上。

然而,由于实现方法的不同,可能会遇到不同的挑战和副作用————所以我认为根据实际情况选择对应的实现很重要,为了赢得漂亮。

你认为呢?上面那些技术,你倾向于用哪种?或者你还有其他的方法?告诉我你的问题、看法,Twitter@johnsundell

感谢阅读!?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-062,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Swift基础 扩展
翻译自:https://docs.swift.org/swift-book/LanguageGuide/Extensions.html
郭顺发
2023/07/17
1480
Swift 中的 Phantom(幻象)类型
模糊的数据可以说是一般应用程序中最常见的错误和问题的来源之一。虽然 Swift 通过其强大的类型系统和完善的编译器帮助我们避免了许多含糊不清的来源——但只要我们无法在编译时保证某个数据总是符合我们的要求,就总是有风险,我们最终会处于含糊不清或不可预测的状态。
韦弦zhy
2022/04/26
9330
Swift 泛型之条件性符合协议
Swift 泛型条件性符合(Conditional conformances) 表示泛型类型只有在其类型参数满足某些要求时才符合特定协议的概念。
韦弦zhy
2021/04/08
1.5K0
46 道 Swift 常见面试题解
3、Set 独有的方法有哪些? 4、实现一个 min 函数,返回两个元素较小的元素 5、map、filter、reduce 的作用 6、map 与 flatmap 的区别 7、什么是 copy on write 8、如何获取当前代码的函数名和行号 9、如何声明一个只能被类 conform 的 protocol 10、guard 使用场景 11、defer 使用场景 12、String 与 NSString 的关系与区别 13、怎么获取一个 String 的长度 14、如何截取 String 的某段字符串 15、throws 和 rethrows 的用法与作用 16、try?和 try!是什么意思 17、associatedtype 的作用 18、什么时候使用 final 19、public 和 open 的区别 20、声明一个只有一个参数没有返回值闭包的别名
Swift社区
2021/11/26
5.5K0
Swift 3到5.1新特性整理
Swift 5.0 最重要的自然是ABI Stability, 对此可以看这篇 Swift ABI 稳定对我们到底意味着什么 。
小刀c
2022/08/16
4.8K0
Swift 3到5.1新特性整理
Swift专题讲解二十——扩展 原
        Swift中的扩展与Objective-C中的类别功能相似,扩展可以为一个已有的类、结构体、枚举或者协议添加新的属性或方法,与Objective-C的类别不同的是,Swift中的扩展没有名称。
珲少
2018/08/15
3230
Swift 中的幻象类型
模糊的数据可以说是一般应用程序中最常见的错误和问题的来源之一。虽然 Swift 通过其强大的类型系统和完善的编译器帮助我们避免了许多含糊不清的来源——但只要我们无法在编译时保证某个数据总是符合我们的要求,就总是有风险,我们最终会处于含糊不清或不可预测的状态。
Swift社区
2022/05/19
1.6K0
Swift学习:扩展
本篇将详细总结介绍Swift扩展的用法; 扩展就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模 )
梧雨北辰
2018/08/09
4770
Swift 中的 Sendable 和 @Sendable 闭包
Sendable 和 @Sendable 是 Swift 5.5 中的并发修改的一部分,解决了结构化的并发结构体和执行者消息之间传递的类型检查的挑战性问题。
韦弦zhy
2022/11/14
1.6K0
Swift 中的 Sendable 和 @Sendable 闭包
Swift 3.1的新改动
Xcode 8.3 和 Swift 3.1 已经发布了(3/28)! 可以通过 AppStore 或 Apple Developer 进行下载 Xcode 8.3 优化了 Objective-C 与 Swift 混编项目的编译速度. Swift 3.1 版本包含一些期待已久的 Swift package manager 功能和语法本身的改进。 如果您没有密切关注 Swift Evolution 进程,请继续阅读 - 本文非常适合您! 在本文中,我将强调Swift 3.1中最重要的变化,这将对您的代码产生重
BY
2018/05/11
2.5K0
WWDC 2021新Formatter API:新老比较及如何自定义
在WWDC 2021的What's in Foundation专题中,苹果隆重介绍了适用于Swift的新Formatter API。网上已经有不少文章对新API的用法进行了说明。本文将通过介绍如何创建符合新API的Formatter,让读者从另一个角度了解新Formatter API的设计机制;并对新旧两款API进行比较。
东坡肘子
2022/07/28
1.4K0
WWDC 2021新Formatter API:新老比较及如何自定义
swift 嵌套类型
xy_ss
2023/11/22
1380
万字长文|Swift语法全面解析|附示例
Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。 swift 是一种安全,快速和互动的编程语言。 swift 支持代码预览(playgrounds),这个特性可以允许程序员在不编译和运行应用程序的前提下运行 Swift 代码并实时查看结果。
悟空聊架构
2020/07/30
3.8K0
戴铭的 Swift 小册子
越来越多同学打算开始用 Swift 来开发了,可很多人以前都没接触过 Swift。这篇和我以前文章不同的是,本篇只是面向 Swift 零基础的同学,内容主要是一些直接可用的小例子,例子可以直接在工程中用或自己调试着看。
Swift社区
2021/12/06
2.3K0
戴铭的 Swift 小册子
Swift 项目中涉及到 JSONDecoder,网络请求,泛型协议式编程的一些记录和想法
最近项目开发一直在使用 swift,因为 HTN 项目最近会有另外一位同事加入,所以打算对最近涉及到的一些技术和自己的一些想法做个记录,同时也能够方便同事熟悉代码。
用户7451029
2020/06/16
6.9K0
Swift 周报 第三十期
本期是 Swift 编辑组自主整理周报的第二十一期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。
Swift社区
2023/09/06
3610
Swift 周报 第三十期
一款功能齐全的iOS混淆工具介绍及功能详解
机缘巧合偶遇iOS马甲包业务,前期也使用过目前市面上其他得工具,实际效果不太理想。经过大量实践,开发出一款功能齐全的混淆工具。工具的主要功能OC、C++、Swift已封装成Mac应用,其他功能还在封装中,敬请期待。
iOS程序应用
2024/04/15
2810
Swift 5.2到5.4新特性整理
SE-0287提案改进了Swift使用隐式成员表达式的能力。Swift 5.4之后不但可以使用单个 使用,而且可以链起来使用。
小刀c
2022/08/16
2.3K0
Swift 5.2到5.4新特性整理
Swift学习总结
5、switch语法与objc差别很大,执行一个分支马上停止,不需要break语句跳出,反而想要穿透到下面分支还要用fallthrough语句。
SheltonWan
2019/06/06
3.1K0
Swift学习总结
iOS混淆探索
也欢迎大家使用不同工具混淆测试工程confuse_test或者第三方开源库项目,对比效果。
confuse
2021/07/12
1.8K0
相关推荐
Swift基础 扩展
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验