首页 > 技术文章 > Swift4 基础

lancgg 2018-02-17 14:23 原文

创建: 2018/02/17

完成: 2018/02/19

更新: 2018/02/25 补充参照型只有类的实例和闭包

更新: 2018/03/03 加红加粗for-in注意事项, 常量不用也不能声明

【任务表】: TODO

 数据类型与变量
 Swift的数据类型

 所有类的实体都是实例,都是运算对象,放到数组和哈希表里都一视同仁。

 没有指针与数据本体的区别,但是被多个同时参照的时候需要区分。

 值型与参照型 

 ● 参照型只有类的实例和闭包  

    值型里的参照型可以看做指针

 

 基本数据类型

  

 Int  整数, 对所有整数都推荐用这个
 UInt  非负整数
 Float  浮点数
 Double  双倍精度浮点数
 Bool

 布尔值,只有true/false

 不是整数

 Character

 Unicode的一个文字

 不是整数

 String  Unicode字符串, 是值型
   
   
   

 

 数值字符

 

 10进制

 除了开头,任何位置都可以放_

 12345, 12_345, 1_2_3_4_5

 开头的0忽视

 012345, 0_12_345

 

 

 实数

 可以用e/E表示10的n次方

 1.23e-1(0.123)

 16进制

 0x开头, x必须小写

 可用0~9, A~F/a~f, 不区分大小写

 可放入_

 0xA_B_1_C, 0xaB1c

 

也可以用科学计数法, P/p

 0x1.8p0(1.5)

 8进制

 0o开头, o必须小写

 可放入_ 

 0o765_432_1

 2进制

 0b开头, b必须小写

 可放入_

 0b11010_110

   
   
   
   
   
   

 

 变量与常量   能用常量的不用变量
 变量的定义  
var 变量名 (: 型) (= 式) // 带括号的可省略
//
var age : Int = 18
var a : Int = 1, b : Int = 2// 多个用 , 连接

 

 (推荐)可以省略型,自动判断

 常量的定义 

 

let 变量名 (: 型) (= 式)
//
let times : Int = 1

 

 类型转换

 Swift不会自动进行类型转换

 转换方法

// 写法
类型(变量)
//
var intA : Int = 1
Double(intA)
Float(intA)

 

 整数之间的比较不受类型限制

 其他都不能跨类型比较(整数和实数不能比,Double和Float不能比)

 字符串

 ""包裹, +连接, +=连接到自己后面

 \t tab

 \n 换行

 \"   "

 \\  \

 \u{} 8位以内的16进制数

 \() 插值

 print函数

 print(..., separator: s=" ", terminator: s="\n") 

 指定多个参数时用separator的字符串来分割,默认空格

 terminator可以指定结尾,默认换行

 数组

 内部没有容量限制,随意存入取出

 一个数组内部存入的实例类型必须相同

 值型

 

var a = [1, 2, 3, 4, 5] // 默认的类型判断

var a : [Int] = [1, 2, 3, 4, 5] // 指明类型

var s = [Int]() // 使用初始化函数

 也可以以式的结果作为元素

 

var a = [ 1+1, 1+2, 1+3, 1+4 ] // [2, 3, 4, 5]

 

 获取数组内部元素

 array[n]

 0开始,array.count-1为末尾

 插入元素

 array.append(v) // v是具体值

 array += v

 运算符

 ● 没有指针,* & ->的意思不一样

 ● . , []不是运算符

 ● 不存在++, --

 ● 等式不返回值, 不能使用连等(a = b = c), 条件式里出现等式会报错

 运算符的注意

  ● 两边都有或者都没有空白的被视为两项运算符

  a + b,   a+b

  ● 单边没有空格的被视为前置/后置运算符

 +a // 前置

 a+ //后置 

 命名法则

 大驼峰记法: 型名, 类名

    Int, Bool, SampleClass

 小驼峰记法: 方法名, 变量名

    firstVal, boderWidth, getLength

 如果要用固有词做变量,加单引号(使用该变量处也要加单引号)

  

var `if` = 1
print("if = \(`if`)")

 

 型参数

 泛型(Generics) # TODO: Supply [泛型 s13]

 

var a : [Int]
var a : Array<Int>

 

 

 

 import模块

 包含基本数据结构(基本类型), 运算, 函数等的是标准库

 import导入库和框架, .swiftdoc, .swiftmodule

 例:

import Cocoa
import UIKit
import Foundation
import Darwin // Foundation内部系统相关部分

 

 

 

 命名空间

 模块名.名字  (方法或者变量名)

 可以嵌套, 模块名.类名.嵌套类名.名字

 Swift也是命名空间,和其他的区分前面加Swift.

 如Swift.print

 

 注释

 单行注释: //

 多行注释: /* ... */ 可以嵌套,内部全作为注释

 控制类语句
 文

 文末不需要;  长的式子可以换行

 多行可以用;分隔写在一行

 代入不可以用,分隔写在一行(用;)

 

 

 if  
if 条件 { // 不要括号
    ...
} else if 条件 {
    ...
} else {
    ...
}

if num > 0 {
    print("num: \(num) > 0")
} else if num == 0 {
    print("num: \(num) == 0")
} else {
    print("num: \(num) < 0")
}

 

 

 while  
while 条件 {
    ...
}

 

 repeat-while

 C的(do-while)

 
repeat {
    ...
} while 条件

 

 
 for-in   
for 常量名 in 式 (where 式子) { // where可省略
    ...
}

 ● 常量自动声明,不用自己去声明,也不能在常量处声明

 ● 只在循环内部有效

 

 范围运算符

 

 A..<B

 1..<2

 A<=x<B, [A, B)的整数

 [1, 2)的整数

 A...B

 1...2

 A<=x<=B, [A, B]的整数

 [1, 2]的整数

 

 switch  
switch 式 {
case 标签1: //可以不要break,也可以写上
    ...
case 标签2:
    ...
default: //可省略
    ...
}

 ● 必须包含所有情况

 ● 条件可以使数值,字符串,其他类型

 ● 如果想要执行完case下沿继续运行,用fallthrough

 ● 实数有误差,避免使用 

 ● 重叠式上方的优先

 

 带标签的循环
标签1: while 条件 { //
    标签2: for i in sampleData {
        ...
        break 标签1
        ...
    }
    ...
    continue 标签2
    ...
}

 ● 在for/while/repeat-while前加上标签

 ● continue/break 指定标签,不指定为当前的循环_

 

 带标签的if , switch  
标签1 : if 条件 {
    标签2: if 条件 {
        ...
        break 标签1
    } else {
    ... 
    }
}

 ● 只能用break, 不能用continue(用了跳出当前循环, 没有循环会报错)

 独立代码块  
do {
    ...
}

 ● 可以带标签, 跳出只能用break

 ● 就是例外处理的do-catch的do

 简单的运行方法 
 playground  File>New>Playground
 命令行  略 # TODO: Supply [命令行下的swift运行 p36]
   
   
   
   
   
   
   
   

推荐阅读