Swift3.0-基础知识
本文对Swift做一个从OC的角度的基础知识简单概要。
| Swift | OC | 说明 |
| let、var | const | 在OC中不用const声明的常量,都认为是变量 |
| Float、Double | CGFloat | |
| Int | NSInteger | |
| String | NSString | |
| Bool | BOOL | OC中的非1为flase,1为ture在Swift中不适用 |
| Array | NSArray | |
| Dictionary | NSDictionary | |
| Set | NSSet | |
| Tuple | - | |
| Optional | - | |
| nil | nil | Swift中的nil和OC中的含义不一样 |
| if语句 | if语句 | if语句的语法写作不一样,尤其是Swift中if嵌套简写 |
| try..throw | - | OC中没有采用抛异常处理机制 |
| assert | NSAssert |
以下的概念,先要有个印象:
1、声明常量用let、声明变量用var
·常量的值一旦设定就不能改变,而变量的值可以随意更改
let a = 10
var b = "hello, world!"
2、类型标注
·通过上面的例子可以看出,声明常量和变量的时候,可以不标注常量或者变量的类型,这是因为Swift的「类型安全和类型推断」功能,可以通过声明常量或者变量的时候赋的初始值推断出这个常量或者变量的类型。
·如果没有赋初始值又想表明该常量或者变量的类型,就的用“: 类型名”的方式标注类型
var welcomMessage : String
3、常量和变量的命名
·命名方面跟OC一样
4、输出常量和变量
·OC语言上使用的是NSLog,Swift使用print(_:separator:terminator:)函数
print(welcomeMessage)
·这个输出函数默认结尾换行,如果不想换行,将空字符串作为terminator的参数传入即可
print(welcomeMessage, terminator:"")
·输出时的拼接采用将常量或者变量放入圆括号中,并在做括号前使用反斜杠将其转义的方式
print("Please speak \(welcomeMessage)")
5、注释
·采用跟OC一样的方式
6、分号
·与OC不一样,Swift不强制使用分号
·如果打算在同一行内写多条独立的语句,那就要使用分号
7、整数与浮点数
·OC使用的NSInteger,Swift使用Int
·OC使用的NSUInteger,Swift使用UInt
·OC使用的CGFloat,Swift使用Double(64位浮点数)、Float(32位浮点数)
8、类型安全和类型推断
·进行类型检查是在编译时期
·浮点型推断成Double而不是Float
·类型安全到Int数值无法跟Double数值直接相加的地步,此时需要使用「数值型类型转换」
9、数值型字面量
·整数字面量:十进制、二进制、八进制、十六进制
·浮点字面量:十进制、十六进制
10、数值型类型转换
·数值型一般使用Int
·Int8和Int16之间不能直接进行计算,需要采用Int16(Int8的数值)进行转换
·整数和浮点数不能直接进行计算,需要采用类似于Double(Int的数值)进行转换
11、类型别名,使用typealias关键字
typealias AudioSample = UInt16
12、布尔值
·Swift采用的是Bool(包括ture和false)
·与OC中的BOOL不一样的是,OC中1代表ture,非1代表false。但是在Swift中的类型安全机制下1不能代表ture
let i = 1
if i {
//这个例子不会通过编译,会报错
}
13、元组tuples
·元组是在Swift语言中出现的一种数据类型,在OC中并没有
·元组的出现,尤其在函数返回值时,元组非常有用。在OC中没有元组的概念,一般需要使用数组或者字典或者自定义类型来达到同样的目的
let http404Error = (404, "Not Found")
// http404Error的类型是(Int, String),值是(404, "Not Found")
let (statusCode, statusMessage) = heet404Error
print("The status code is \(statusCode)")
// 可以将以一个元组的内容分解成单独的常量和变量,然后就可以正常的使用它们了
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 如果只需要一部分元组值,分解的时候可以把要忽略的部分用下划线( _)标记
print("The status code is \(http404Error.0)")
// 可以通过下标来访问元组中的单个元素,下标从0开始
let http200Status = (statusCode:200, description: "OK")
print("The status code is \(http200Status.statusCode)")
// 在定义元组的时候可以给单个元素命名后,通过名字来获取这些元素的值
14、可选类型optionals
·可选类型在OC中没有出现过,在OC中与可选类型最接近的一个概念就是nil。在OC中nil表示“缺少一个合法的对象”,但是nil表示的是对象。对于结构体、基本的C类型或者枚举类型,OC一般使用比如NSNotFound来暗示值的缺失。
·但是在Swift中的nil与OC中的概念是不一样的,在OC中nil指向不存在对象的指针,在Swfit中nil不是指针,他是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。并且在Swift中nil不能用于非可选类型的常量和变量。如果代码中有常量或者变量需要处理值缺失的情况,那么将它们声明成对应的可选类型。
·可选类型可以做作类型表明也可以作为类型推断出的类型,比如下面的代码
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// 并不是所有的String类型都能够转换成Int型,如果转换不成功的时候返回的就是nil。所以这种情境下,SwiftUI推测convertedNumber的类型是Int?
var serverResponseCode: Int? = 400
// serverResponseCode包含一个可选的Int值404
serverResponseCode = nil
// serverResponseCode现在不包含值
var surveyAnswer: String?
// 如果在声明一个可选常量或者变量的时候没有赋值,它们会自动被设置为nil
15、nil在if语句中的使用及强制解析
·使用相等(==)或者不等(!=)来判断一个可选值是否包含值。
·如果确定一个可选类型包含值,可以使用在可选的名字后面加一个感叹号(!)来获取值。
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
16、可选绑定
·可选绑定可以用在if和while语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。
·关于在if语句中完成可选绑定在代码上并不复杂,但是if语句和OC的不一样需要注意下
if let actualNumber = Int(possibleNumber) {
var accountNumber = actualNumber + 12
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 这里需要注意的是,其一actualNumber只用在后面的可选类型有值的情况下才创建并赋值,如果不存在,actualNumber常量不会被创建;其二,actualNumber只是临时常量,只有在if的body分支中可以使用。
·另外就是if的嵌套使用在Swift语法中需要的代码更加简洁,下面两种代码表述是一样的:
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
if let firstNmuber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && sectondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
17、隐式解析可选类型
·有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次又要判断和解析可选值是非常低效的,因为可以确定它总会有值。这种类型的可选状态被定义为隐式解析可选类型。如果在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和在没有值的普通可选类型后面加一个感叹号一样。因此,仍然可以把隐式解析可选类型当作普通可选类型来判断它是否包含值。
let possibleString: String? = "An optional string."
let forcesString: String = posssibleString!//需要感叹号来获取值
let assumedString: String! = "An implicitly unmrapped optional string."
let implicitString: String = assumedString//不需要感叹号
if assumedString != nil {
print(assumedString)
}
18、错误处理
·OC中并没有使用try...throws...catch...的抛出异常处理的机制,Swift这次把它加进来了
func makeAsandwich() throws {
//...
}
do {
tyr makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
19、断言
·在OC中也是有断言(使用的是NSAssert),Swift中使用assert
·当条件可能为假时使用断言,但是最终一定要保证条件为真,这样你的代码才能继续运行。断言的适用情景:
·整数类型的下标索引被传入一个自定义下标实现,但是下标索引值kennel太小或者太大
·需要给函数传入一个值,但是非法的值可能导致函数不能正常执行
·一个可选值现在是nil,但是后面的代码运行需要一个非nil值
Swift3.0-基础知识的更多相关文章
- swift3.0基础语法
swift 3.0 基础语法 目录 01-变量和常量 02-运算符 03-可选项 04-条件语句 05-循环 06-字符串 07-元组 08-数组 09-字典 10-对象和类 11-枚举 12-属性 ...
- Swift3.0 基础学习梳理笔记(一)
本篇是我在学完一遍基础语法知识的时候,第一遍复习,我一遍梳理一遍记录的笔记.同时分享给像我一样在学习swift 的猿友们. 本篇可能过于冗长.所以所有的参考资料都分模块的写在palyground 里, ...
- swift3.0基础语法(2)
变量/常量,元组声明 var aaa = 0;//声明变量aaa 首次赋值时自动解析为Int类型 var aaa:Int = 0;//声明Int类型变量aaa let aaa = 0;//声明常量aa ...
- vue2.0基础知识,及webpack中vue的使用
## 基础指令 ## [v-cloak]{ Display:none; } <p v-cloak>xx{{msg}}xx</p> //解决闪烁问 ...
- Swift3.0基础语法学习<二>
对象和类: // // ViewController2.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/15. // Copyright © ...
- OpenGL ES 3.0 基础知识
首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系: 管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区.其中顶点 ...
- 在Eclipse在使用JUnit4单元测试(0基础知识)
自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数.这些函数的功能可能非常强大,但我们在 ...
- swift3.0 基础练习-构造对象并按要求进行排序(struct)
struct练手 构造10个学生(要求有学生的姓名.数学成绩.英语成绩),按照学生英语和数学平均分的成绩从小到大输出学生的姓名.数学成绩.英语成绩及平均分 创建一个学生构造体,包含 姓名 name 数 ...
- Swift3.0基础语法学习<一>
// // ViewController.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/15. // Copyright © 2016年 ...
- Swift3.0基础语法学习<五>
异常处理: // // ViewController5.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/16. // Copyright © ...
随机推荐
- AcWing 850. Dijkstra求最短路 II 堆优化版 优先队列 稀疏图
//稀疏图 点和边差不多 #include <cstring> #include <iostream> #include <algorithm> #include ...
- PHPStorm设置Ctrl+滚轮调整字体大小
1.点击左上角的File,再点击setting: 2.Editor->General,选择Change font size (Zoom) with Ctrl+Mouse Wheel: 3.点击O ...
- 163music 反爬分析
# 网易163 音乐的 mp3下载 .mp3 下载的一个API吧 封 IP 的一种报错 网易云就给我返回了一个{"code":-460,"msg":" ...
- 【常见浏览器的UA】
"所谓 UA(User Agent / 用户代理),最初是指浏览器告知网站管理员,本浏览器支持的类型和框架,让网站管理员以支持的模式结构向浏览器发送页面,呈现给用户浏览.演变到今天,网站管理 ...
- JVM(三、双亲委派机制)
javadoc的解释: ClassLoader的每一个实例都会有一个与之关联的父ClassLoader,当被要求去寻找一个类或者资源的时候,ClassLoader的实例就会对于类或者是资源的寻找委托给 ...
- jvm字节码助记符
反编译指令 javap -c xxxx.class JVM参数设置 -xx:+<option> 开启option -xx: -<option> ...
- vue中,怎么给data对象添加新的属性?(尼玛这面试题居然让我给碰上了。。。。)
Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: <template> <div> <ul> <li v-for="v ...
- jquer_shijian 增加初始化 年月日 及 结束时间 年月日
增加了插件 在初始化的时候,控制 年月日,和结束 年月日 $(time_createobj).siblings(".xtw_budget_userdatafn_hide").shi ...
- 「JSOI2015」圈地
「JSOI2015」圈地 传送门 显然是最小割. 首先对于所有房子,权值 \(> 0\) 的连边 \(s \to i\) ,权值 \(< 0\) 的连边 \(i \to t\) ,然后对于 ...
- Python - 运行流程图, call graph, 调用图
解决方案 pycallgraph(感觉直接用pycallgraph grahviz命令生成的图并不是我想要的) 如何去阅读并学习一些优秀的开源框架的源码? - mailto1587的回答 - 知乎 h ...