注:近期学习swift,看的是人民邮电出版的《从零开始学习Swift3》(小差错不少),目前只看到了前几章。每章的知识点 琐碎,同时存在与其他语言易混淆的部分,不常用的难理解的部分记录下来。
第一章
1、函数签名:
是由函数(或者方法)的名称和参数标签组成,不包括返回值与参数类型。
在Swift3之后,调用函数 时要求指定所有参数的标签,除非函数定义时,使用下划线(_)关键字声明标签。
//1、 函数标签:rectangleArea(W:H:) 调用时候,如果没有W H,参数标签就是width与height
func rectangleArea(W width:Double, H height: Double) -> Double{
let area = width * height
return area
}
// 调用
rectangleArea(W: 1, H: 2)
//2、 函数标签:rectangleArea(_:H:)
func rectangleArea(_ width:Double, H height: Double) -> Double{
let area = width * height
return area
}
// 调用
rectangleArea(1, H: 2)
上函数中,WH_是参数标签,width height是参数名。参数名是在函数或者方法内部使用的名字,参数标签是在函数或者方法调用时使用的参数名。
2、Swift的开发工具:
xcode开发工具;AppCode最优秀的第三方开发工具。
AppCode是付费软件。Xcode是主流。
在xcode代码编辑区域,如果想查询比较完整全面的帮助文档,可以按住Alt键双击某个方法,打开XcodeAPI帮助搜索结果窗口。
第二章
1、编写与运行swift方式
1.1 交互式方式运行(REPL 或者 Playground)
1.2 编译为可执行文件方式运行(iOS 或者 macOS工程)
REPL:Read-Eval-Print Loop--读取求值输出循环
启动Swift: 直接在终端输入swift回车即可(xcode6 输入xcrun swift)
退出::exit或 :quit
通过Xcode创建macOS工程 就是创建Command Line Tool命令行
第三章
1、标识符
区分大小写,可以是字母、数字、下划线、中文、表情,首字母不是是数字。
关键字作为标识符,必须加上重音符号,重音符号不是标识符的一部分。
let `class` = "123" // ``也可以用于其他标识符,`a`与a是等价的
let `a100` = "1"
print(a100) // 打印 1
2、关键字
关键字是区分大小写的。下划线(_)关键字表示模式匹配,可以替换任何字符。
3、常量let 变量var
常量只能初始化一次,可以带上类型先定义,再赋值也是可行的。变量声明时候如果不写类型必须初始化。要么不初始化,但是必须加上类型。
var var01 = 100;
var var02 : String
var var03 // var var03 编译失败
let和var关键字声明时候,原则上优先使用let。可以防止程序运行过程中不必要的修改并提高程序的可读性。不能修改let变量的值,但是可以通过指针获得对象后,修改对象内部的属性。
特别注意,引用数据类型声明时,经常采用let声明,虽然从业务层面来讲并不需要一个常量,但是使用let可以防止引用数据类型在程序运行过程中被错误地修改。
4、注释 表达式
// 单行注释; /**/ 块注释;Swift的多行注释可以嵌套。表达式在声明变量和常量时候不要指定数据类型。因为这样程序代码非常简洁,但有时需要指定特殊的数据类型,例如var a:Int16 = 10代码。对应语句结束后的分号不是必须情况下也不要加。多语句写在一行上要加分号。
第四章
1、一元运算符 二元运算符
swift不存在a++ ++a --a a--等运算符,应该使用a += 1 a-=1替换。二元运算符中浮点数取余运算的时候%不能使用。整数可以。用浮点数的truncatingRemainder(dividingBy: )函数进行取余运算。
2、算术赋值运算符
+= 加赋值, -= 减赋值, *=乘赋值, /= 除赋值, %=取余赋值。
3、关系运算符
=== 恒等于 主要用于引用类型数据比较 eg:a === b a与b引用同一个实例时候返回true 否则返回false,比较两个引用的内容是否为同一个实例。 !== 与===相反 不恒等于
4、位运算符
“~” 位反:按位取反
“&” 位与:两位全部为1,这一位才为1
“|” 位或:只要有一个为1 这一位就是1
“^” 位异或:两位相反时这一位才为1
“>>”右移:比如UInt8,右移之后,(超出8位)右边两位去除,高位补零。
“<<”左移:比如UInt8,左移之后,(超出8位)左边两位去除,低位补零。
第五章
1、Swift的数据类型
整型、浮点型、布尔型、字符、字符串(String)、元组、集合、枚举、结构体属于值类型
- Int8相当于OC的char Int16相当于OC的short Int32相当于int Int64相当于OC的long Int相当于OC的NSInteger
类属于引用类型
2、浮点型
浮点型主要用来存储小数数值,也可以用来存储范围较大的整数。默认的浮点数是Double类型
var vard:Double = 2553333
3、数字表示方式
3.1 进制表示
二进制数:0b 0b11100 (28)
八进制数:0o 0o34(28)
十六进制数:0x 0x1C (28)
3.2 指数表示
十进制指数: 3.36e2 (3.36 * 10的2次幂)
还有补零、添加下划线表示的形式 都是可以的。
4、整型之间的转换
Swift中,不同类型的变量/常量 不能相互运算,编译失败。必须显示转换(利用构造函数)
let historyScore:UInt8 = 90
let englishScore:UInt16 = 130
let totalScore = UInt16(historyScore) + englishScore
注:一般提倡小范围转大范围,不提倡大范围转小范围,可能会造成精度的丢失,甚至运行异常。
整型与浮点数类型转换和上文类似。
5、布尔型
在Swift中,布尔类型只有两个值 true false
6、元组类型
元组是一种数据结构,元组就像一条表的记录,各字段类型不必相同。元组在作为函数返回多值时尤其重要。在分解元组时候 不需要的字段可以用下划线"_"代替:
// 写法
let info = ("123", 18)
let info1 = (name: "123" , age: 18)
let (name, age) = ("123", 18)
var student = (id:"1002", name:"zhangsan",english_score:32,chinese_score:80)
let (id1,name1,_,_) = student
print(id1,name1, student.0, student.id) // .键值(键存在时) .下标都可以访问
7、可选类型
Swift所有的数据类型声明的变量或者常量都不能为空值(nil)
如果一个变量/常量的值 可能为空 可能不为空,就用当前类型的可选类型 Int->Int? Int!
可选类型的存在主要是因为Swift是强类型,Int类型的 除了能存储整型数据,其他都不可以存储, 包括nil。
Int?是对Int的一层包装,它们是2种不同的数据类型。可以直接将Int类型赋值给Int?类型(小->大)
如果某个变量一直有值 就用普通类型
如果不确定是否有值就用可选类型:? !
"?": 开始不确定有没有值的存在,拆包时候需要用感叹号!拆包 (显示拆包)
"!": 一般是开始确定一定有值,拆包时候 省略感叹号! (隐式拆包)
let n1:Int? = 10 // 可选类型
print(n1!) // 显式拆包 / 强制拆包
var n2:Int! = 10 // 隐式拆包可选类型
print(n2) // 隐式拆包
var n3:Int?
print(n3!) // 不正确,!强制拆包 some必须有值--fatal error: unexpectedly found nil while unwrapping an Optional value(可选类型打印是Optional(xxx))
可选绑定:选择性的赋值,如果可选类型值存在 就自动解包赋值给一个常量或者变量,如果可选类型值不存在,就不创建这个常量或者变量
// 方法
func n1Value(n: Int)->Int?
{
if n == 0 {
return nil
}else {
return n
}
}
// 可以自动解包,n0就是解包后的Int类型
if let n0 = n1Value(n: 1) { // 多个值绑定语句用逗号分隔,只要有一个值绑定失败,整个结果就是false
let nn : Int = n0 // 不报错 说明n0是普通类型
print("n0创建 值为:\(n0)")
}else{
print("n0没有创建")
}
第六章
1、字符 ---- 使用双引号 (单字符)
var char01: Character = "a" // 单字符
var charStr:Character = "\u{26}" // Unicode编码
2、字符串(结构体) ---- 使用双引号 (单字符或者多字符)
- 使用String的原因:String是个结构体,性能更高,NSString是一个OC对象,性能略差,String支持直接遍历, Swift提供了String和NSString之间的无缝转换
var str0: String = "Objective-C and Swift" // String可省略,默认是String类型
let emptystring1 = "" // 单字符
字符串的长度:
str0.characters.count // str0.characters字符串的遍历 Character类型
3、转义符
“ \t ”: 水平制表符
" \n ": 换行
" \r ": 回车
" "" ": 双引号"
" ' ": 单引号'
" \" ": 反斜杠\
4、字符串的拼接(++=\append相同类型 \()不同类型)
-
可变字符串: var定义
不可变字符串:let定义append拼接: lamda2.append("a") // 必须是单个字符 lamda2+="123" // +=写在引号外部 print(andSign2+"字符串bu相等"+lamda2) // +写在引号外部 print("5=\(2+3)") // 将Int类型转String类型拼接,表达式写在引号内部
-
*字符串的格式化
// 字符串的格式化 var min = 12 var second = 23 var time = String.init(format: "%02d: %02d", arguments: [min, second])
5、字符串的插入删除替换 截取
// 字符串的操作--String.Index是索引类型
var str0: String = "Objective-C and Swift"
5.1、插入字符 insert(_ newElement: Character, at i: String.Index)
str0.insert(".", at: str0.endIndex) // "Objective-C and Swift."
5.2、删除字符remove(at i: String.Index)-> Character
str0.remove(at: str0.index(before: str0.endIndex)) // "."
5.3、删除指定范围removeSubrange(_ bounds: ClosedRange
var startIndex = str0.startIndex
var endIndex = str0.index(startIndex, offsetBy: 9) // 从startIndex索引开始向后9个字符的索引值
var range = startIndex...endIndex
str0.removeSubrange(range) // "C and Swift"
5.4、替换replaceSubrange(_ bounds: ClosedRange
startIndex = str0.startIndex
endIndex = str0.index(startIndex, offsetBy: 0)
range = startIndex...endIndex
str0.replaceSubrange(range, with: "C++") // "C++ and Swift"
5.5、*字符串的截取
这种不再使用了,String.Index索引类型不方便
//str.substring(to: <#T##String.Index#>)
//str.substring(from: <#T##String.Index#>)
//str.substring(with: <#T##Range#>)
这样用,先String转NSString,再调用NSString的截取方法,传入Int即可。(str as NSString)是NSString类型
(str as NSString).substring(to: <#T##Int#>)
6、字符串的比较
大小: >、 < 是否相等: ==、 !=
(Swift的Foundation中NSString使用=== 、 !==是否相等)
""和String()创建的空字符串是相等的。
let emptystring1 = ""
let emptystring2 = String()
if emptystring1 == emptystring2 {
print("相等")
}else
{
print("不等")
}
字符串的hasSuffix(_ :) hasPrefix:(_ :)
lamda2.hasPrefix("1") // false
lamda2.hasSuffix("3") // true