Swift 语法(一)

基本类型

  • 变量和常量

使用 var 来声明变量,使用 let 来声明常量,示例代码:

var myVariable = 42
myVariable = 50

let myConstant = "Hello"

PS: 常量或变量的类型必须和你赋给它们的值一样。但不必明确地声明类型,声明的同时赋值的话,编译器会自动推断类型。

也可以显式声明变量,如下所示:

let url:String = "www.abc.com" //显式声明 url 为 String 类型
var a, b, c : Double //显式声明 a, b, c 均为 Double 类型
  • 各种进制表示
let decimalInt:Int = 17 //十进制
let binaryInt:Int = 0b10001 //二进制
let octalInt:Int = 0o21 //八进制
let hexInt:Int = 0x11 //十六进制
  • 布尔型
let imTrue:Bool = false;
if imTrue { //条件语句,不加括号。非0整型不能解读为布尔类型
    print("I'm true")
}
else {
    print("I'm false")
}

if 1+1==2 { //OK
    print("1 + 1 = 2")
}
  • 浮点型
let floatNum:Float = 3.1415926 //Float 精度为小数点后6位,因此实际结果为 3.141593
let doubleNum:Double = 3.1415926

//PS: 默认为 Double 类型
  • Character
//Character 可以表示汉字或表情(若不显式定义为 `Character` 类型,则为 `String` 类型)
let enLetter:Character = "a"
let cnLetter:Character = "你"
let dog:Character = "🐶"
let cool:Character = "\u{1F60E}"
  • 元组

元组:将多个不同的值集合成一个数据。
特点:可以有多个值;不同的值可以是不同类型。
示例代码:

//定义
var point = (1, 3)
var httpResponse = (404, "Not Found")

//显式定义,限定类型
var point2:(Int, Int, Int) = (1, 2, 4)
var httpResponse2:(Int, String) = (200, "OK")

//可以给变量命名,这样解包时可通过名字访问
var point3 = (x:1, y:2, z:4)
var point4:(x:Int, y:Int, z:Int) = (1, 2, 4)

//解包(即获取元组里的元素)
let (xx, yy) = point
httpResponse.0
httpResponse.1

//命名后即可用名字访问
point3.x
point4.y

//可用下划线 _ 表示对该变量不关心
let loginInfo = (true, "user")
let (isSuccess, _) = loginInfo
  • 其他
//以科学计数法形式定义
var d = 1.2e5 //1.2*10^5
var e = 1.2e-5 //1.2*10^-5

//可用下划线 _ 分隔大数,便于区分。例如定义一百万
let bigNum = 1_000_000

此外,变量还可以命名为汉字(或其他 Unicode8 编码的字符)或表情符号,例如:

var 名字 = "Ace"
var 😀 = "smile"

print(名字, 😀)
print(名字, 😀, separator:" - ") //自定义 print 分隔符(默认是空格)
print(名字, 😀, separator:"--", terminator:", end") //自定义结束符(默认是回车 \n)
// 注意:单词不要拼错了

还可以在 print 中使用 \() 方便的显示变量,例如:

let i=2, j=3, k=5
print("\(i) * \(j) * \(k) = \(i*j*k)") //打印结果:2 * 3 * 5 = 30\n

运算符

  • 算数运算符
let x1:UInt8 = 12
let x2:UInt16 = 21

//二者必须强制转换为相同类型才能进行运算
let m = UInt16(x1) + x2 //注意强转的写法
let n = x1 + UInt8(x2)

逻辑控制语句

  • for

for..in 循环示例代码:

for index in 1...5 { //... 前后都是闭区间
    index
//    index = 3 //error, 这里的 index 是常量
}

for index in 1..<5 { //..< 前闭后开区间
    index
}

若不关心循环到了多少次,可以这么写:

var result = 1
var base = 2
for _ in 1...10 { //忽略第几次
    result *= base
}

此外,有时为了跳出多个循环嵌套,可以给循环命名,例如:

// 跳出指定的循环,给循环命名
findAnswer:
for m in 1...300 { //
    for n in 1...300 {
        if m*m*m*m - n*n == 15*m*n {
            print(m, n)
            break findAnswer //结束循环过程
        }
    }
}
  • while

while 循环:

var i = 0
while i < 3 {
    print(i)
    i++
}

repeat..while 循环(相当于 do..while):

var j = 0
repeat {
    j++
    print(j)
} while j < 3
  • switch

C, Java 等语言相比,Swift 语言的 switch 语句有许多变化。

var rating = "a"
switch rating {
case "A", "a": //判断多种不同的值
    print("great")
case "B":
    print("so-so")
case "C":
    print("bad")
default : //switch 必须穷举所有情况
    print("error")
}

注意: case 语句后无需 break, 执行一个 case 后自动跳出。

case 后可以是布尔类型或浮点型等,例如:

let b = true
switch b {
case true:
    print("true")
default:
//    print("false")
//    break
    () //若无任何操作,可用 break 或 () 来结束
}

switch 高级用法,switch 后还可以是一个区间,例如:

let score = 89
switch score {
case 0:
    print("you got an egg")
case 1..<60: //判断区间
    print("you failed")
case 60..<80:
    print("good")
case 80..<90:
    print("nice")
case 90..<100:
    print("great")
case 100:
    print("perfect")
default:
    print("error")
}

switch 还可以配合元组使用,例如:

let point = (1, 1)
switch point {
case (0, 0):
    print("0, 0")
case (_, 0): //忽略一些内容
    print("x-axis")
case (0, _):
    print("y-axis")
case (-2...2, -2...2): //可以使范围
    print("near the origin")
default:
    print("youa are crazy")
}

配合关键字 fallthough 使用:

let point2 = (0, 0)
switch point2 {
case (0, 0):
    print("origin")
    fallthrough //穿透 case,但下层 case 中不能声明变量
case (_, 0):
    print("x-axis")
    print("value of x is \(x)")
case (0, let y):
    print("y-axis")
    print("value of y is \(y)")
case (let x, let y):
    print("the point is (\(x), \(y))")
}

配合关键字 where 使用:

let point3 = (2, 2)
switch point3 {
case (let x, let y) where x == y: //where 又增加了限制条件
    print("It's on the line x=y")
case let (x, y) where x == -y:
    print("It's on the line x=-y")
case let (x, y):
    print("the point is (\(x), \(y))")
}

此外,case...where 也可以用在 if 语句中,例如:

let age = 19
switch age {
case 10...19:
    print("you're a teenager")
default:
    print("you are not")
}

if case 10...19 = age {
    print("you're a teenager")
}

if case 10...19 = age where age >= 18 {
    print("you're a teenager")
}
  • guard 关键字

这是 Swift 中的新特性,示例代码:

//一般函数 (func 是定义函数的关键字)
func buy(money:Int, price:Int, capacity:Int, volume:Int) {
    if money >= price {
        if capacity >= volume {
            print("I can buy it!")
            print("¥\(money-price) left")
            print("\(capacity-volume) cubic meters left")
        }
        else {
            print("No enough capacity")
        }
    }
    else {
        print("No enough money")
    }
}

//使用 guard 关键字后的函数(与前者等效)
func buy2(money:Int, price:Int, capacity:Int, volume:Int) {
    guard money >= price else {
        print("No enough money")
        return
    }
    
    guard capacity >= volume else {
        print("No enough capacity")
        return
    }
    
    print("I can buy it!")
    print("¥\(money-price) left")
    print("\(capacity-volume) cubic meters left")
}

buy(20, price: 12, capacity: 80, volume: 60)
buy2(20, price: 12, capacity: 80, volume: 60)

使用 guard 关键字可以把核心逻辑不相关的分隔开,使程序条理更清晰。还有其他用法,以后再总结。

字符串

  • 声明
//声明字符串
var str = "Hello, playground"
var str:String = "Hello, playground" //显式声明
var str = String("Hello, playground")

//声明空的字符串
var emptyString = ""
var emptyStr = String()
var emptyStr = String("")
  • 字符串连接
var mark = "!!!"
str + mark //不改变 str 的值
str += mark //改变 str 的值
  • 遍历
//遍历字符串中的每一个字符
for c in str.characters {
    print(c)
}
  • 索引
var str = "Hello, Swift"

str.characters.count //字符串长度, 12

var startIndex = str.startIndex //首位字符索引, 0. (闭区间, 即包含该索引位)
str[startIndex] //获取首位字符, 即 "H"
str[startIndex.successor()] //获取后一位对应的字符, 即 "e"
str[startIndex.advancedBy(2)] //距离,类似偏移量, 即 "l"

str.endIndex //末位字符索引, 12. (开区间, 不包含该索引位)
str[endIndex.predecessor()] //获取末位字符, 即 "t"
str[endIndex] //error, 这样是错误的,越界了

注意:索引是前闭后开的,即 [startIndex, endIndex)

增删字符:

//添加字符到指定位置
str.insert("?", atIndex: endIndex)

//移除最后一个字符
str.removeAtIndex(endIndex.predecessor())
  • 区间
//Range<Index> 类型,可以移除字符串中的一个子字符串
var range = startIndex..<endIndex

//移除某个区间内的字符串 (PS: 这里全部移除了)
str.removeRange(startIndex..<endIndex)
  • 常用方法
str.isEmpty //判空
str.characters.count //字符串的长度(解析字符串长度时,一个汉字或一个表情都算一个长度)
str.uppercaseString //转大写
str.lowercaseString
str.capitalizedString //首字母大写
str.containsString("af") //是否包含某字符串
str.hasPrefix("ca") //判断前缀
str.hasSuffix("end") //判断后缀

str.append(mark2) //字符串后添加一个字符(Character),会改变 str 变量
str + String(mark2)

str.appendContentsOf("---") //添加字符串
  • 转义符

常见的如下:

var s = "\"" //双引号 "
var t = "\t" //制表符
var n = "\n" //换行符
  • 其他

根据需要保留相应的小数位数:

let s0 = "one third is \(1.0/3.0)" //0.333333333333333
var s1 = String(format: "one third is %.2f", 1.0/3.0) //0.33

格式化字符串:

let s2 = " -- hello --- " as NSString //转为NSString类型

//去除空格和下划线
s3.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: " -"))

总结自 玩儿转Swift 2.0(第一季)

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

推荐阅读更多精彩内容