Swift 学习笔记

Table of Contents

1 变量与常量

1.1 let 用来定义一个常量 : 初始赋值之后不能改变

1.2 var 用来定义一个变量 : 初始赋值之后可以改变

1.3 变量的类型

变量的类型可以根据 其赋值 来隐式的指定 也可以在变量名 后面 增加 【colon + 类型】 ,显式的指定变量的类型

let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble : Double = 70

2 追加字符串

  • 使用 加号 【+】
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
  • 使用 斜线 括号 【\()】
“ backslash (\) before the parentheses. For example:”
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

3 数组与字典

3.1 数组

3.1.1 初始化

  • 对于单一类型的数组初始化
let a:String[] = ["1","n”]
String[]表示字符串数组类型
Swift 支持隐式表达式,所以也可以不指定类型
let a = ["1", "n"]
  • Swift 中也可以存储多种不同类型的值
let a:Array = ["1", 1, ["1", "n"]]
也可以隐式声明
let a = ["1", 1, ["1", "n"]]

@<font color="#ff0000"> 注意

同一个数组,最好只存一种类型的值,这样方便存取,也不容易出bug。 定义数组的时候最好使用显示定义。 显示定义时,如果书写错误,编译器可以直接报错 @</font> ArrayError1.jpeg

  • 初始化空数组
var a = Int[]() // 括号表示一个函数调用吧

@<font color="#ff0000"> 注意 未初始化的数组不能使用 @</font> ArrayError2.jpeg

  • Swift数组类型也提供初始化方法来创建确定长度和提供默认数值的数组。你可以通过这个初始化方法增加一个新的数组,元素的数量成为count,合适的默认值为repeatedValue
var threeDoubles = Double[](count: 3, repeatedValue: 0.0)  // threeDoubles 的类型为 Double[], 以及等于 [0.0, 0.0, 0.0]
  • 也可以使用Array初始化数组
var a =Array(count:2, repeatedValue:0)
但不能忽略count和repeatedValue

ArrayError3.jpeg

3.1.2 读取和修改

  1. let 定义的数组属于常量数组,不可改变 长度, 但可以改变每个位置的值
    let a = [1, 2, 4, 5]
    a[0] = 9
    
    a   // a = [9, 2, 4, 5]
    
  2. var 定义的数组,可以改变长度,
    • 使用append增加 元素
    var a = [1, 2, 3, 5]
    a.append(6)
    
    a   // a = [1, 2, 3, 5, 6]
    
    • 使用+= 增加 元素
    var a = [1, 2, 3, 5]
    a += 6    // 不能使用 a = a + 6
    
    a   // a = [1, 2, 3, 5, 6]
    
  3. 下标语法来修改数组的值
    var a = [1, 2, 3, 4]
    a[0...1] = [7, 8]
    a // a == [7, 8, 3, 4]
    
    // let 定义的数组不能用这个方法修改数组的值
    
  4. 几个命令
    var a = [1,2,3,4]
    a.insert(8, atIndex:0)
    a   // a = [8, 1,2,3,4]
    
    let c = a.removeAtIndex(0)    // c == 8 ,  a = [1,2,3,4]
    
    
    let d = a.removeLast()   // d = 4,  a = [1,2,3]
    

3.2 字典

let 定义的字典不能改变, var 定义的字典可以改变。 字典 是无序的 有一个方法: uddateValue(forKey:) 需要研究一下其返回值

4 Swift中的?和!

4.1

Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,即变量没有默认值,所以在使用变量之前没有赋值就会出问题 如果希望声明变量时,希望这个变量有个初始值,那就需要把这个变量定义成 【Optional】

声明为Optional只需要在类型后面紧跟一个?即可。如:

var strValue: String?   //?相当于下面这种写法的语法糖
var strValue: Optional<Int>

Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None, 非nil就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因, 也是PlayGround会把Optional值显示为类似{Some "hello world"}的原因,这里是enum Optional的定义:

enum Optional<T> : LogicValue, Reflectable {
    case None
    case Some(T)
    init()
    init(_ some: T)

    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool

    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> Mirror
}

文档中也有提到说,在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?,经喵神指正,”Optional Chaining的问号的意思是询问是否响应后面这个方法,和原来的isResponseToSelector有些类似”,如果是nil值,也就是Optional.None,固然不能响应后面的方法,所以就会跳过,如果有值,就是Optional.Some,可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,比如:

let hashValue = strValue?.hashValue

一旦声明为Optional的,如果不显式的赋值就会有个默认值nil。判断一个Optional的值是否有值,可以用if来判断:

if strValue {
    //do sth with strValue
}

当我们需要使用这个Optional变量的值的时候,可以使用如下方法:

var strValue : String?
let tempValue = strValue
if tempValue {
// 如果 tempValue的值不为nil,就执行这里
}else{
// 如果 tempValue的值为nil 就执行这里
}


上面几行语句可以简写成
var strValue ; String?
if let tempValue = strValue {
//使用tempValue
}else {
}

4.2

我们可以在确定知道 一个Optional变量不为nil的时候,使用 ! 来对Optional进行强行解包(unwrapp)来得到变量的哈希值。

var a : String? = "aa"
a  // {some "aa"}
a!.hashvalue   // 5,863,207  这个数字的含义暂时不理解

5 Swift隐藏键盘

self.view.endEditing(true)


Author: weikent (weishijian@weikents-MacBook-Air.local)

Date:

Emacs 24.4.1 (Org mode 8.2.10)

Validate