References: The Swift Programming Language

某程序员对书法十分感兴趣,退休后决定在这方面有所建树。于是花重金购买了上等的文房四宝。一日,饭后突生雅兴,一番磨墨拟纸,并点上了上好的檀香,颇有王羲之风范,又具颜真卿气势,定神片刻,泼墨挥毫,郑重地写下一行字:hello world


print("Hello, World")

值与类型

定义变量用 var,常量用 let。常量只能赋值一次,但不用必须在声明的时候去赋值。

var myVariable = 42
myVariable = 50

let myConstant = 42

编译器会自动推断常量和变量的类型,但是如果推断不出来(比如说没有初始值等),就需要声明类型。

let helloTalk : String
helloTalk = "helloTalk"

let helloTalk = "helloTalk"

Swift的值不会隐式被转为其他类型

let widthFloat = 93.33          // 自动推断 为 Double
let width : Int = widthFloat    // 把 Double 赋值给 Int,会报错
let widthLabel = label + String(width)
// 把值转换成字符串还可以这样: \(ValueName)
let widthString = "width: \(width)."

创建、定义一个数组或者字典

let emptyArray = [String]()
let emptyDictionary = [String: Float]()
// 或者
let emptyArray = []
let emptyDictionary = [:]

数组和字典都是集合类型,对于这种类型的 letvar 修饰并非是像普通值的可否赋值。 比如说,用 let 修饰的数组是不能添加和移除数组中的元素,数组中的元素个数、位置均不可变,但是用 var 修饰的数组可以添加/删除元素。

枚举

枚举是为一组相关的值定义了一个共同类型,在 Swift 中,枚举是“一等公民”。枚举成员的原始值不仅可以是整形,还可以是字符、字符串、浮点型;此外,枚举还支持属性、方法、甚至是构造函数、扩展和遵守协议。

enum 关键词来创建枚举:

enum Direction {
    case north
    case south
    case east
    case west
}
// 或者用逗号分隔写作一行:
enum Direction {
    case north, south, east, west
}

let direction: Direction = .west

原始值

enum Direction: String {
    case north = "北"
    case south = "南"
    case east = "东"
    case west = "西"
}

let north = Direction.north     // the sanme as : let north = Direction(rawValue: "北")
north.rawValue  // "北"

关联值

Swift 的枚举可以存储各个类型的关联值,而且每个成员的类型可以都不一样。所以对于一个网络请求可以有这样的抽象:一个网络请求的结果,可以是成功或者失败的,如果成功则返回的是我们想要的数据,不成功返回错误原因,那么可以写成这样:

enum Result<Value> {
    case success(Value)
    case failure(Error)
}

Value 是泛型语法,可以是任何你需要的类型。

控制流

for-in

let persons = ["person1","person2"]
for personString in persons {
  print(personString)
}
// 遍历字典
let dict = [
            "name" : "Joke",
            "age"  : 16
        ] as [String : Any]
        
for (key,value) in dict {
  print("\(key) : \(value)")
}

if-else

if 2>1 {
  print("2 大于 1")
}else{
  print("2 还是大于 1 啊")
}

if 后面必须是布尔表达式,如果是一个值的话不会隐式的与 0 比较。

switch

let vegetable = "red pepper"
switch vegetable {
case "celery":
  print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
  print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
  print("Is it a spicy \(x)?")
default:
  print("Everything tastes good in soup.")
}

switch 不仅支持基本数据类型。另外Swift中的switch语法可以省略break。但是不能省略 default,会报 Switch must be exhaustive, consider adding a default clause 的编译错误。

while

var i = 1
while i<100 {
  i += 1
}
// 或者
var i = 1
repeat{
  i += 1
}while i < 100