IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 如何让你的 Swift 代码更 Swift化 -> 正文阅读

[移动开发]如何让你的 Swift 代码更 Swift化

Swift 有很多其他语言所没有的独特的结构和方法,因此很多刚开始接触 Swift 的开发者并没有发挥它本身的优势。

1、有where条件的 for 循环

现在,我们要对view.subviews中的UIButton做一些不可描述的事情,用 for 循环怎么来遍历呢?

在下面的写法中,更推荐后面两种写法:

?
for subView in view.subviews {
    if let button = subView as? UIButton {
        //不可描述的事情
    }
}

?
for case let button as UIButton in view.subviews {
    //不可描述的事情
}

?
for button in view.subviews where button is UIButton {
    //不可描述的事情
}


2、枚举enumerated()

在 Swift 中进行 for 循环,要拿到下标值,一般的写法要么定义局部变量记录下标值,要么遍历 0..<view.subviews.count。其实还有个更方便的写法:enumerated(),可以一次性拿到下标值和遍历的元素。

  • ? 第一种肯定是不推荐的,因为还要定义额外的局部变量,容易出错,pass

  • ? 第二种在只需要用到下标值的时候,是可以用的,但如果还要用到下标值对应的元素,就还得再取一次,麻烦,pass

  • ? 第三种就比较完美,虽然一次性可以拿到下标值和元素,但其中一个用不到就可以用?_

?
var index: Int = 0
for subView in view.subviews {
    //不可描述的事情
    index += 1
}

?
for index in 0..<view.subviews.count {
    let subView = view.subviews[index]
    //不可描述的事情
}

?
//index 和 subView 在循环体中都能使用到
for (index, subView) in view.subviews.enumerated() {
    //不可描述的事情
}

//只用到 index
for (index, _) in view.subviews.enumerated() {
    //不可描述的事情
}

//只用到 subView
for (_, subView) in view.subviews.enumerated() {
    //不可描述的事情
}

3、first(where: )

filter?是 Swift 中几个高级函数之一,过滤集合中的元素时非常的好用,不过在某些情况下,比如获取集合中满足条件的第一个元素时,有一个更好的选择first(where: )

let article1 = ArticleModel(title: "11", content: "内容1", articleID: "11111", comments: [])

let article2 = ArticleModel(title: "11", content: "内容2", articleID: "22222", comments: [])

let article3 = ArticleModel(title: "33", content: "内容3", articleID: "3333", comments: [])

let articles = [article1, article2, article3]

?
if let article = articles.filter({ $0.articleID == "11111" }).first {
    print("\(article.title)-\(article.content)-\(article.articleID)")
}

?
if let article = articles.first(where: {$0.articleID == "11111"}) {
    print("\(article.title)-\(article.content)-\(article.articleID)")    //11-内容1-11111
}

4、contains(where: )

这个和上面的first(where: )几乎一样,比如这里要判断文章列表里是否包含 articleID 为 11111 的文章:

?
if !articles.filter({ $0.articleID == "11111" }).isEmpty {
    //不可描述的事情
}

?
if articles.contains(where: { $0.articleID == "11111"}) {
    //不可描述的事情
}

5、forEach

当循环体内的逻辑比较简单时,forEach 往往比 for...in...来的更加简洁:

func removeArticleBy(ID: String) {
    //删库跑路
}

?
for article in articles {
    removeArticleBy(ID: $0.articleID)
}

?
articles.forEach { removeArticleBy(ID: $0.articleID) }

6、计算属性 vs 方法

我们知道计算属性本身不存储数据,而是在 get 中返回计算后的值,在 set 中设置其他属性的值,所以和方法很类似,但比方法更简洁。一起来看下面的示例:

?
class YourManager {
    static func shared() -> YourManager {
        //不可描述的事情
    }
}

let manager = YourManager.shared()

?
extension Date {
    func formattedString() -> String {
        //不可描述的事情
    }
}

let string = Date().formattedString()


?
class YourManager {
    static var shared: YourManager {
        //不可描述的事情
    }
}

let manager = YourManager.shared

?
extension Date {
    var formattedString: String {
        //不可描述的事情
    }
}

let string = Date().formattedString
复制代码

7、协议 vs 子类化

尽量使用协议而不是继承。协议可以让代码更加灵活,因为类可同时遵守多个协议。

此外,结构和枚举不能子类化,但是它们可以遵守协议,这就更加放大了协议的好处

8、保留 Struct 的默认初始化器

大家都知道,Swift 中的 Struct 是值类型,自带一个成员初始化器。

不知道大家有没有遇到这样的情况,需要自定义 Struct 的初始化器,又想保留默认的初始化器,但是自定义后,默认的初始化器就消失了。

先看下默认的初始化器:

自定义初始化器后,默认初始化器就消失了:

?

想同时保留自定义的和默认的,就得祭出 extension 大法了:

?

?

Struct vs Class

尽可能使用 Struct 而不是 Class。Struct 在多线程环境中更安全,更快。

它们最主要的区别, Struct 是值类型,而 Classe 是引用类型,这意味着 Struct 的每个实例都有它自己的唯一副本,而 Class 的每个实例都有对数据的单个副本的引用。

这个链接是苹果官方的文档,解释如何在 Struct 和 Class 之间做出选择。?Choosing Between Structures and Classes | Apple Developer Documentation

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:04:20  更:2022-09-30 01:04:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:04:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码