字面量
var age = 10
var isRed = false
var name = "liyanyan"
- 其中
10
,false
匹舞,liyanyan
是字面量线脚;
常見的字面量類型
- public typealias Float32 = Float
- public typealias Float64 = Double
- public typealias IntegerLiteralType = Int
- public typealias FloatLiteralType = Double
- public typealias BooleanLiteralType = Bool
- public typealias StringLiteralType = String
- 在Swift中絕大部分自帶的類型,都支持直接通過字面量進行初始化晰绎,Bool括丁,Int,String尖昏,Double构资,Array蚯窥,Dictionary,Set巍沙,Optional荷鼠,F(xiàn)loat等
字面量協(xié)議
- Swift中絕大部分自帶的類型,都支持直接通過字面量進行初始化矮嫉,原因在于它們遵守了字面量協(xié)議牍疏;
- Bool:ExpressibleByBooleanLiteral
- Int:ExpressibleByIntergerLiteral
- Float鳞陨,Double:ExpressibleByFloatLiteral
- Dictionary:ExpressibleByDictionaryLiteral
- String:ExpressibleByStringLiteral
- Array,Set:ExpressibleBySetLiteral
- Optional:ExpressibleByNilLiteral
字面量協(xié)議的應(yīng)用
模式匹配
- 模式:用于匹配的規(guī)則援岩,比如switch的case掏导,捕捉錯誤的catch等趟咆;
通配符模式
enum Life {
case human(name: String,age: Int?)
case animal(name: String,age: Int?)
}
func check(_ life: Life) {
switch life {
case .human(let name, _):
print("human",name)
case .animal(let name, _?):
print("animal",name)
default:
print("other")
}
}
-
case .human(let name, _):
表示life是human類型且name有值履植,age可以為任何值悄晃;
-
case .animal(let name, _?):
表示life是animal類型且name有值,age不能為空庶近;
標(biāo)識符模式
var age = 10
var isRed = false
var name = "liyanyan"
值綁定模式
let point = (3,2)
switch point {
case let (x,y):
print("point",x,y)
}
元組模式
let points = [(0,0),(1,0),(2,0)]
for (x,_) in points {
print(x)
}
let name: String? = "Li"
let age = 18
let info: Any = [1,2]
switch (name,age,info){
case (_?, _, _ as String):
print("case")
default:
print("default")
}
枚舉case模式
let age = 2
func test() {
if age >= 0 && age <= 9 {
print("[0,9]")
}
if case 0...9 = age {
print("[0,9]")
}
guard case 0...9 = age else {
return
}
print("[0,9]")
}
let ages: [Int?] = [2,3,nil,5]
for case nil in ages {
print("有nil值")
break
}
let points = [(1,0),(2,1),(3,0)]
for case let (x,0) in points {
print(x)
}
可選模式
let age: Int? = 33
if case let x? = age{
print(x)
}
if case .some(let x) = age {
print(x)
}
let ages: [Int?] = [nil,2,3,4,nil]
for case let age? in ages {
print(age)
}
for item in ages {
if let age = item {
print(age)
}
}
func check(_ num: Int?) {
switch num {
case 2?: //首先不為空敷鸦,且數(shù)據(jù)為2
print("2")
case 4?:
print("2")
case _?:
print("other")
case _:
print("nil")
}
}
類型轉(zhuǎn)換模式
let num: Any = 6
func test() {
switch num {
case is Int:
//num 依然是Any類型
print("is Int",num)
default:
break
}
}
func test1() {
switch num {
case let n as Int:
//num 依然是Any類型
//n 是Int
print("as Int",n + 1)
default:
break
}
}
表達式模式
let point = (1,2)
func test() {
switch point {
case (0,0):
print("(0,0)")
case (-2...2,-2...2):
print("-2,-2")
default:
print("the point is x,y")
}
}
自定義表達式模式
- 可以通過重載運算符扒披,自定義表達式模式的匹配規(guī)則圃泡;
-
case
底層調(diào)用的是~=
運算符颇蜡,那么我們通過重載~=
運算符,實現(xiàn)自定義表達式模式的匹配規(guī)則;
struct Student {
var score = 0
var name = ""
//pattern:case后面的內(nèi)容
//value:switch后面的內(nèi)容
static func ~=(pattern: Int,value: Student) -> Bool {
value.score >= pattern
}
static func ~=(pattern: ClosedRange<Int>,value: Student) -> Bool {
pattern.contains(value.score)
}
}
func test() {
var s = Student(score: 55, name: "Jack")
switch s {
case 100:
print(">=100")
case 90:
print(">=90")
case 80...89:
print("[89]")
case 60...79:
print("[60,79]")
default:
print(">=0")
}
}
extension String {
static func ~=(pattern: (String) -> Bool,value: String) -> Bool {
pattern(value)
}
}
func hasPrefix(_ prefix: String) -> ((String) -> Bool) {
{
(str: String) -> Bool in
return str.hasPrefix(prefix)
}
}
func hasSuffix(_ suffix: String) -> ((String) -> Bool) {
{
(str: String) -> Bool in
return str.hasSuffix(suffix)
}
}
var str: String = "123456"
switch str {
case hasPrefix("123"):
print("以123開頭")
case hasSuffix("456"):
print("以456結(jié)尾")
default:
break
}
where
條件編譯
//操作系統(tǒng)
#if os(macOS) || os(iOS)
//CPU架構(gòu)
#elseif arch(x86_64) || arch(arm64)
//swift版本
#elseif swift(<5) && swift(>=3)
//模擬器
#elseif targetEnvironment(simulator)
//可倒入某模塊
#elseif canImport(Foundation)
#else
#endif
日志打印
- 實現(xiàn)在Debug模式在打印日志,在Release模式下不打印日志薪贫;
- 新建
log.swift
文件刻恭,實現(xiàn)自定義log
方法鳍贾,如下:
import Foundation
func log<T>(_ msg: T,file: NSString = #file,line: Int = #line,fn: String = #function) {
#if DEBUG
let prefix = "\(file.lastPathComponent)_\(line)_\(fn):"
print(prefix,msg)
#endif
}
系統(tǒng)版本檢測
if #available(iOS 10, macOS 10.12, *){
//對于iOS平臺 只在iOS 10及以上版本執(zhí)行
//對于macOS平臺 只在macOS 10.12及以上版本執(zhí)行
//* 表示在其他所有平臺都執(zhí)行
}
API的可用性
//Person的使用條件
@available(iOS 12,macOS 10.15, *)
class Person {}
struct Student {
//方法study_已經(jīng)改名為study
@available(*,unavailable,renamed: "study")
func study_() {}
func study() {}
//run方法在iOS11 macOS10.12版本已經(jīng)廢棄
@available(iOS,deprecated: 11)
@available(macOS,deprecated: 10.12)
func run() {}
}