Swift 拾遗

基础语法

  • 常量let和变量var
 let name = "Sun"
var mutableName = "Li"

编译器会推断该变量类型.
也可以指定类型

let name: String = "Hello"
  • 类型别名 typealias
    typealias MyInt = Int

  • Bool 类型
    在需要使用Bool 类型的地方使用了非Bool ,会触发错误

let i = 1
if i { ... } // 错误提示
//更改为
if i == 1 { ... }
  • 元组
let http404 = (404,"notFound")
// 还可以给元素命名
let http404 = (status:404,msg:"notFound")
let (statusCode , statusMsg) = http404
//访问第二个元素
print(" \( http404.1)")
  • 强制解析 !

  • 可选绑定

if let constName = someOption {  ... }

if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {

print("\(firstNumber) < \(secondNumber) < 100") } // 输出 "4 < 42 < 100"

if let firstNumber = Int("4") { if let secondNumber = Int("42") { if firstNumber < secondNumber && secondNumber < 100 {

print("\(firstNumber) < \(secondNumber) < 100") } } } // 输出 "4 < 42 < 100"
  • 隐式解析 !
    当我们第一次声明一个变量的时候就可以确定他一定有值,那摩我们就可以使用非可选类型 (在类型后面使用 ! ,而非 ?),这样在使用的时候就不必 强制解析了
let possibleSting: String ! = "Sun"

运算符

  1. swift 提供恒等 ===!== 来判断两个对象是否引用同一个实例对象
  2. Nil Coalescing Operator 空合 运算符 ??
    a ?? b 对a 进行解包,如果包含值就 解包,否则就返回默认值 b。(表达式a 必须按时Optional 类型,且b的类型要和a 解包后的类型一致)
  3. 区间运算符 a...b a..< b

字符串

是值类型,每次进行方法传递都会进行值的 copy

集合 Array,Set,Dictionary

使用var ,let 指定集合的可变和不可变

  1. Array
    存储同一类型的多个值,可以使用Array<Element>指定存储的元素类型
var someInt = [Int] ()
var someInt 2= [1,1,3]
var threedous = Array(repeating:20.0,count :3)
var shoopingList:[String] = ["a","b"]

//遍历
for item in shoppingList {  }
for (index,value) in shoppingList.enumerated() {
    print("\(index) = \(value)")
}

  1. 集合类型 Set

你可以使用你自定义的类型作为集合的值的类型或者是字典的键的类型,但你需要使你的自定义类型符合 Swift 标准库中的 Hashable 协议。符合 Hashable 协议的类型需要提供一个类型为 Int 的可读属性 hashValue 。由类 型的 hashValue 属性返回的值不需要在同一程序的不同执行周期或者不同程序之间保持相同
因为 Hashable 协议符合 Equatable 协议,所以遵循该协议的类型也必须提供一个"是否相等"运算符( == )的实 现。这个 Equatable 协议要求任何符合 == 实现的实例间都是一种相等的关系。也就是说,对于 a,b,c 三个值来 说, == 的实现必须满足下面三种情况: • a == a (自反性) • a == b 意味着 b == a (对称性) • a == b && b == c 意味着 a == c (传递性)

集合的创建

var letters = Set<Character>()
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]

字典

可以用 [Key: Value] 这样简化的形式去创建一个字典类型。

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
let emptyDic = [String:String] ()
let dic = Dictionary<String,Int>()

遍历

for (airportCode, airportName) in airports {
     print("(airportCode): (airportName)") 
}
for airportCode in airports.keys  {
      print("Airport code: (airportCode)") 
} // Airport code: YYZ // Airport code: LHR

for airportName in airports.values {
     print("Airport name: (airportName)") 
}

控制流

switch
  1. 不存在隐式贯穿,即 匹配一个case 后就终止匹配,不会执行default
  2. switch 允许区间匹配case (100... 400): 和默认值匹配(_,anthor)
  3. case 值绑定 case (let x ,let y) :
  4. where 条件
    case let (x,y) where x == y :
  5. 复合匹配
    就是将多个符合条件情况放到一个case下,用,分隔开
    case (let a,0) ,(0,let b) :
  6. 每一个case 都必须有执行语句
let anotherCharacter: Character = "a" 
switch anotherCharacter { 
case "a": // 无效,这个分支下面没有语句 
case "A":
    print("The letter A") 
default:
    print("Not the letter A") 
} // 这段代码会报编译错误

改为

let anotherCharacter: Character = "a" 
switch anotherCharacter {
   case "a", "A":
       print("The letter A")
  default:
       print("Not the letter A") 
} // 输出 "The letter A

函数

  1. 可变参数
    函数参数是同一类型的参数常量
func mutableParams(param: Double...) -> Double{
    var total = 0.0;
    for item  in param {
        print(item)
        total += item
    }
    return total
}
  1. inout 参数
    使用 inout 修饰,使用& 传递参数引用
func swap(p1: inout Int, p2: inout Int) -> (Int,Int) {
    let temp = p1
    p1 = p2
    p2 = temp
    return (p1,p2)
}
  1. 函数类型
    函数的类型是由 函数的参数和返回值确定的
    我们定义一个函数类型的变量
var backCount: (Int ,Int) -> Int = swap  

闭包

学习闭包和可能会被他那简略的语法迷惑,我们这里做一个总结

  • 利用上下文推断参数类型和返回值类型
  • 单表达式闭包可省略 return
  • 参数名缩写
  • 尾随闭包
  • 闭包和函数都是引用类型
public mutating func sort(by areInIncreasingOrder: (Element, Element) -> Bool)

闭包语法

{  (params) -> in 
  exec...
}
  1. 参数省略 return
    在单表达式中可以省略 ,它会根据上下文推断得出,有时候in 也可以省略

  2. 参数名缩写 $0$1

尾随闭包

如果你需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾 随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。在使用尾随闭包时,你 不用写出它的参数标签


func someFunctionThatTakesAClosure(closure: () -> Void) {
// 函数体部分 
}
 // 以下是不使用尾随闭包进行函数调用 someFunctionThatTakesAClosure(closure: {
// 闭包主体部分 
}) 
// 以下是使用尾随闭包进行函数调用 someFunctionThatTakesAClosure() {
// 闭包主体部分
 }


逃逸闭包
  • 在参数名之前加 @escaping
  • 该闭包在函数返回之后执行
  • 默认情况下是非逃逸的

    将一个闭包标记为 逃逸意味着你必须在闭包中显式地引用 self 。比如说,在下面的代码中,传递到 omeFunctionWithEscapingClosure(:) 中的闭包是一个逃逸闭包,这意味着它需要显式地引用 self 。相对 的,传递到 someFunctionWithNonescapingClosure(:) 中的闭包是一个非逃逸闭包,这意味着它可以隐式引用 self
    另外将一个闭包添加到函数之外的数组中,在函数定义的时候也需要明确指明盖闭包是逃逸的,不然编译错误

自动闭包

自动闭包是一种自动创建的闭包,用于包装传递给函数作为参数的表达式。 这种闭包不接受任何参数,当它被调 用的时候,会返回被包装在其中的表达式的值。这种便利语法让你能够省略闭包的花括号,用一个普通的表达式 来代替显式的闭包。

自动闭包让你能够延迟求值,因为直到你调用这个闭包,代码段才会被执行。

var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] print(customersInLine.count) // 打印出 "5"

let customerProvider = { customersInLine.remove(at: 0) } print(customersInLine.count) // 打印出 "5"

print("Now serving \(customerProvider())!") // Prints "Now serving Chris!" 

print(customersInLine.count) 
// 打印出 "4"

我们举一个将闭包传递给函数的例子


// customersInLine is ["Alex", "Ewa", "Barry", "Daniella"] 

func serve(customer customerProvider: () -> String) {
     print("Now serving \(customerProvider())!") 
} 

serve(customer: { customersInLine.remove(at: 0) } ) 
// 打印出 "Now serving Alex!"

如果我们不传递一个显示的闭包,而是传递一个自动闭包

// customersInLine is ["Ewa", "Barry", "Daniella"] 

func serve(customer customerProvider: @autoclosure () -> String) {

     print("Now serving \(customerProvider())!") 

} 

serve(customer: customersInLine.remove(at: 0)) // 打印 "Now serving Ewa!"

恩,有点😲,休息一下🙃

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272

推荐阅读更多精彩内容