Swift语法中的奇淫技巧和盲点(持续更新)

1. case let where  if 等一些关键字之间的语法糖

import UIKit

let age = 19

// 判断age在0~19之间,并且还要大于18
if case 0 ..< 20 = age, age > 18{ // if case表示用逗号表示同时满足
    print("aaa")
}

// 解包,x为第一项的值,并且x还要在2~5之间
let vector = (4, 0)
if case (let x, 0) = vector, x >= 2 && x <= 5 {
    print("bbb")
}

// 输出1~10之间能被三整除的数
for case let i in 1...100 where i % 3 == 0 { // 这里不能用逗号替代where
    print(i)
}

for case参考博客:https://www.jianshu.com/p/d13bda313da7

2. if let的使用

import UIKit

var error: Int? = 404
var errorMessage: String? = "Not found"

// 在if let中,前两个let是解包,后面一个逗号是where判断
if let error = error, let errorMessage = errorMessage, error == 404 {
    print("aaa")
    print(error)
    print(errorMessage)
}

3. 可选链和nil coalesce

import UIKit

var error: Int? = 404
var errorMessage: String? = "Not found"

errorMessage?.uppercased() // 这叫可选链,避免了我一层一层解包
if let errorMessage = errorMessage?.uppercased() { // errorMessage?.uppercased()返回的还是一个可选型,因此仍然可以用if let解包
    print(errorMessage)
}

// nil coalesce
let message: String
let message3 = errorMessage ?? "No error" // 如果errorMessage有值,就用,不然就返回一个默认值

4. 隐式可选型

在类中声明的变量,类型后加一个叹号表示这个是隐式可选型,表明这个变量在初始化的时候暂时为空,我们就可以不在第一段构造中对他进行初始化,而他在第一段初始化中默认为nil,但是我们应该保证在第二段初始化中我们要对这个变量进行初始化。

import UIKit

var errorMessage: String! = nil // 隐式的可选型
errorMessage = "not found"
let newString = "The message is " + errorMessage // 这里的errorMessage不用打!号,因为他是隐式可选型,直接使用
print(newString)
import UIKit

class City {
    let cityName: String
    unowned var country: Country
    init(cityName: String, country: Country) {
        self.cityName = cityName
        self.country = country
    }
}

class Country {
    let countryName: String
    var capitalCity: City! //隐式可选型,这里是可以为nil的,如果不加感叹号,那么在下面的构造函数中就一定要完全传入有值的参数,而传入的是self,就进入了死循环,所以要加上!表示只要countryName有值self就可以有值了,就不会报错了
    
    init(countryName: String, capitalCityName: String) { // 构造函数穿进去两个参数都是字符串
        self.countryName = countryName
        self.capitalCity = City(cityName: capitalCityName, country: self) // 首都的构造函数,country传入的是自己
    }
    
    func showInfo() {
        print("This is \(countryName).")
        print("The capital is \(capitalCity.country).")
    }
}

let china = Country(countryName: "China", capitalCityName: "Beijing")
china.showInfo()

5. sort和sorted

import UIKit

var arr = [Int]()
for _ in 0 ..< 1000 {
    arr.append(Int(arc4random() % 1000))
}
arr.sort() // 没有返回值,同时改变arr
arr
arr.sorted() // 返回排序后的数组,同时改变arr
arr

6. sort函数传入自己定义的函数

import UIKit

var arr = [Int]()
for _ in 0 ..< 1000 {
    arr.append(Int(arc4random() % 1000))
}

// 自定义一个函数
func biggerNumberFirst(a: Int, b: Int) -> Bool {
    return a > b
}
arr.sort(by: biggerNumberFirst) // 传入的是一个函数变量

func near500(a: Int, b: Int) -> Bool { // 比较谁离500最近
    return abs(a - 500) < abs(b - 500) ? true : false
}
arr.sort(by: near500)

7. switch专讲

switch的case后面可以接逗号并列的量,也可以接范围,也可以接元组,元组还可以用_省略,以及用let解包

import UIKit

var rating = "A"

// switch的条件必须满足全部可能出现的情况,不然报错
switch rating {
case "A", "a": // 这里也可以用逗号表示满足其中一种情况
    print("Great!")
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值