本文内容学习自DamonLu的文章,写在CSDN中为了自己后续学习swift时方便查看,原文地址 https://juejin.cn/post/7028506186743808008,如有侵权告知必删
引言
Swift有很多语言所没有的独特的结构和方法,因此很多刚开始接触Swift的开发者并没有发挥它本身的优势
有条件的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 in UIButton {
}
enumerated()
在swift中进行for循环,要拿到下标值,一般的写法要么 定义局部变量记录下标值,要么 遍历 0…<view.subviews.count 。其实还有个更方便的写法:enumerated(),可以一次性拿到下标值和遍历的元素。
var index:Int = 0
for subview in view.subviews {
index += 1
}
for index in 0..<view.subviews.count {
let subview = view.subviews[index]
}
for(index,subview) in view.subviews.enumerated() {
}
for (index,_) in view.subviews.enumerated {
}
for (_,subview) in view.subviews.enumerated {
}
first(where:)
filter是swift中几个高级函数之一,过滤集合中的元素时非常的好用,不过在某些情况下,比如获取集合中满足条件的第一个元素时,有一个更好的选择first(where:)
let article1 = ArticleModel(titile:"11",conteng:"内容1",articleID:"1111",comments:[])
let article1 = ArticleModel(titile:"22",conteng:"内容2",articleID:"2222",comments:[])
let article1 = ArticleModel(titile:"33",conteng:"内容3",articleID:"3333",comments:[])
let articles = [article1,article2,article3]
if let article = articles.filter({$0.articleID == "1111"}).first {
print("\(article.title)-\(article.content)-\(article.articleID)")
}
if let article = article.first(where:{$0.articleID == "1111"}) {
print("\(article.title)-\(article.content)-\(article.articleID)")
}
contains(where:)
这个和上面的first(where:)几乎一样,比如这里要判断文章列表里是否包含articleID为1111的文章:
if !articles.filter({$0.articleID == "1111"}).isEmpty {
}
if articles.contains(where:{$0.articleID == "1111"}) {
}
forEach
当循环体内的逻辑比较简单时,forEach往往比for…in…来的更加简洁:
func removeArticleBy(ID:String) {
}
for article in articles {
removeArticleBy(ID:$0.articleID)
}
articles.forEach{ removeArticleBy(ID:$0.articleID) }
计算属性 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
协议 vs 子类化
尽量使用协议而不是继承。协议可以让代码更加灵活,因为类可同时遵守多个协议。
此外,结构和枚举不能子类化,但是它们可以遵守协议,这就更加放大了协议的好处
Struct vs Class
尽可能使用 Struct 而不是 Class。Struct 在多线程环境中更安全,更快。 它们最主要的区别, Struct 是值类型,而 Classe 是引用类型,这意味着 Struct 的每个实例都有它自己的唯一副本,而 Class 的每个实例都有对数据的单个副本的引用。
|