Swift笔记一:基础部分

基础部分

简介

基本数据类型

Int : 整型
Double、Float : 浮点型。
Bool : 布尔型。
String :文本型数据。
Array、Set、Dictionary : 集合类型。
Tuple : 元组。
Optional :可选类型。

常量和变量

let : 来声明常量。
var : 来声明变量。

let maxmunNumberOfLoginAttempts = 10    //常量
var currentLoginAttempt = 0     //变量

类型标注

//声明一个类型为String,名字为welcomeMessage的变量
var welcomeMessage: String

类型安全和类型推断

类型安全:类型安全的语言可以让你清楚地知道代码要处理的值的类型。编译代码的时候进行类型检查,并把不匹配的标记为错误。
类型推断:声明变量的时候并不一定要赋值和声明类型,类型推断会帮你确定合适的类型。编译器在编译代码的时候自动推断出表达式的类型。原理:检查赋值即可。
推断浮点数的时候,swift 总会选择Double, 而不选择Float。

常量名和变量名

输出常量和变量

func print(_ items: Any..., separator: String = default, terminator: String = default)
  // items: 要输出的0个或多个元素。
  //separator: 每个item之间要打印的信息,默认是" "
  //terminator: 所有的item打印完成之后要输出的信息。默认是换行"\n"

demo:

var name = "river li"
var age = 25
print("the current value of name is \(name), age is \(age)")
  //the current value of name is river li, age is 25

注释

多行注释嵌套

/*
    /*
    var a = 12
    var b = 25
    */
    c = 45
*/

分号

不强制使用,但一行内多有个语句必须使用分号隔开。

数字可读性增强

let a = 1000000
let a = 1_000_000
let b = 123.0012
let b = 000123.0012

整数转化

  1. Swift 中不允许隐式的类型转换。
  2. 字面量相加,类型推断。
let c : Int16 = 5
let d : Int8 = 4
let e = c + d   //错误,编译保存
print("c+d=\(e)") 

let f = c + Int16(d)  // 正确
print("c+d=\(f)")   

let m = 3 + 12.3    //不报错, 类型推断
let h = d + 12.3    //报错12.3 被推断成Double

类型别名

typealias AudioSample = UInt16

布尔值

let right = true    //Bool
let wrong = false   //Bool
if right {
    print("right")
}else{
    print("wrong")
}
let i = 1
if i {
    // 编译报错,i类型推断为Int类型,不是Bool类型。if的判断条件只能使用Bool类型
}

if i==1 {
    print("right")
}

元组

元组:把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是同类型的。

let http404Error = (404, "Not Found")

元组内容分解:
元组适合临时组织值,不适合创建复杂的数据结构。

let(statusCode, statusMessage) = http404Error
print("The statusCode is \(statusCode)")
//The status code is 404

print("The statusMessage is \(statusMessage)")
//The status message is Not Found

let(statusCode, _) = http404Error  //只取部分元组信息,不需要的使用_忽略

//使用下标访问
let statusCode = http404Error.0
let statusMessage = http404Error.1

//定义元组指定元素名
let http200Status = (statusCode: 200, description: "OK")
//通过元素名称来获取元素
let statusCode = http200Status.statusCode
let description = http200Status.description

可选类型

使用可选类型(optionals)来处理值可能缺失的情况。
Swift中的nil
​ Swift中的nil和OC中的nil不一样。OC中,nil是一个指向不存在对象的指针。Swift中,nil不是指针,它是一个确定的值,用来表示缺失,任何类型都可以被设置为nil,不只是对象类型。
​ nil不能用于不可选的常量和变量。如果代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
​ 如果声明一个可选常量或者变量但没有赋值,它们会自动被置为nil。

Int(String) //将一个字符串转换成整数,要么能转化成功"123", 要么转化不成功"Hello"
let possibleNumber = "123"
let coverteNumber = Int(possibleNumber)
//返回值converteNumber被推断为Int?  或者 optional Int

Int?    //? 暗示可能是Int值也可能不包含值。

let m : Int = nil   //报错
let m : Int?        //m默认为nil

可选值的强制解析

当你确定可选类型有值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个感叹号表示“我知道这个可选有值,请使用它”。这称谓“可选值的强制解析”
使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。

var a : Int?
a = 40
let b = !a

可选绑定

使用可选绑定来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。

var a : Int? = 16
// 如果a包含可选值,把值赋给b,条件成立。如果a不包含可选值,则条件失败
if let b = a {
    print("b value is \(b)")
}else {
    print("不能访问b")
}

隐式解析可选类型

可选类型暗示了常量或者变量可以"没有值"。可选可以通过if来判断是否有值,如果有值可以使用可选绑定来解析值。

var a : Int?
if a == nil {
  print("a 没有值")
}
a = 12
if let c = a {
    print("c=\(c)")
}
let possibleString: String? = "An optional String"
let forcedString: String = possibleString! //需要使用!

// 注意这里,不是问号而是感叹号,这就是隐式解析可选类型,取值的时候不用加!
let assumedString: String! = "An implicatly unwrapped optinal string"
let implicitString: String = assumedString

一个隐式解析可选类型其实就是一个普通的可选类型。但可以当做非可选类型来使用。并不需要每次都是用!号来获取值。
如果隐式解析可选类型没有值的时候尝试读取值会触发运行时错误。

错误处理

fun canTrowAnError() throws {
    //这个函数有可能抛出错误。
}

一个函数可以通过声明中添加throws关键字来抛出错误消息,当你的函数能抛出错误消息时,你应该在表达式中前置try关键字

do{
  try canTrowAnError()
}catch {
  // 有一个错误消息抛出
}

一个do语句创建了一个新的包含作用域,使得错误能被传播到一个或者多个catch语句中。

func makeASandwich() throws{
    // ...
}
func eatASandwich() throws{
    // ...
}

do {
    try makeASandwich()
    eatASandwich()
}catch SandWichError.outOfCleanDishes {
        washDishes()
}catch SandWichError.missingIngredients(let ingredients){
    buyGroceries(ingredients)
}

断言

如果在值缺失或者值并不满足特定条件的情况下,你的代码可能无法继续执行,这时,你可以在你的代码中触发一个断言,来结束代码运行,并通过调试来找到问题的原因。

func assert(_ condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)
// condition 断言条件
// message condition为false的时候触发输出message信息,默认为空字符串
// file 如果断言失败,则打印文件名,默认是该方法所处的文件。
// line 如果断言失败,则打印行号,默认是该方法所处的行号。

当代码使用优化编译的时候,断言将会被禁用,Xcode的release模式下,断言就会被禁用
何时使用断言:
条件为假,但需要条件为真的时候代码才能继续执行。
断言可能导致应用终止,所以发布的时候一定要去掉断言。

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

推荐阅读更多精彩内容