一:基础知识
1. Float与Double有时在比较是比如1.2与1.2的比较为什么表示时不相等?
2. 元组主要是解决什么问题的?
变量定义与数
var population:Int = 100;
var price:Float = 100.0;
let address:String = "潜江";
if语句,循环语句
//if语句示例
var population = 20;
let name:String = "raojunbo";
if (population < 50 ){
print("20018:\(name)人口小于\(population)");
}else{
print("2018:\(name)人口超标了");
}
population = 100;
if(population < 50){
print("20019:\(name)人口小于\(population)");
}else{
print("2019:\(name)人口超标了");
}
//switch语句示例
var statusCode:Int = 404;
var statusString:String = "潜江市";
switch statusCode {
case 400:
statusString = "很好";
case 401:
statusString = "一般";
default:
statusString = "默认";
}
print(statusString);
//while循环
var i:Int = 0;
while (i < 10 ){
print(i);
i+=1;
}
//for 循环
var i:Int = 0;
for i in 2...6 {
print(i);
}
元组(Swift特有)
//有点类似于Object-C里的字典,主要是在返回参数时,可以同时返回两个参数
var statusCode:Int = 404;
var statusString:String = "这是状态错误";
let error = (statusCode,statusString);
let error2 = (code:statusCode,error:statusString);
print("\(error.0),\(error.1)");
print("\(error2.code),\(error2.error)")
字符串
Swift字符串的字符都是Character类型,Swift的Character类型表示Unicode字符。组合起来就是字符串的实例
可空类型(Swift特有)
Swift可空类型让这门语言更加安全,(有点类似于NSObject里的weak属性)一个可能为nil的实例应该被声明为可空类型。在Swift的变量必须给定一个初始值,否则编译不过。也可声明成一个可空类型。任何变量类型都可以用可空类型来说明一个实例可能是nil。哪怕是一个Int类型,而NSObject只能允许对象是nil
var errorStr = String?;
print(errorStr);
将可空变量的真实存在的值赋值给另一个变量,即绑定;绑定的过程也是展开的过程
var play:Int?
if let w = play {
print(w);
}
//将可空的play绑定到w变量上。是空,不做任何操作,不为空就给w;
var errorCodeString:String?
errorCodeString = "404";
var upperCodeString = errorCodeString?.uppercased();//链式调用
var errorDescription:String?;
let description = errorDescription ?? "error"
二:容器类型
数组
这里的数组里的类型必须是相同类型
//数组定义,添加元素,删除元素
var bucketList:[String] = ["rao","jun"];
bucketList.append("bo")
bucketList.append("nihao")
bucketList.removeLast();
for item in bucketList {
print(item)
}
注意
是用let bucketlist申明的是不可变的数组,是用var申明的是可变的数组
字典
var movieDict = ["rao":1,"jun":2,"bo":3];//申明
movieDict["qing"] = 4//设置
movieDict.removeValue(forKey: "qing")//移出key=qing的值
var keyArray = movieDict.keys;//全部的key值
for item in keyArray {
print(item)
}
注意
不可变的字典就是用let修饰
集合
函数
func printPersonGreeting2 (to name:String, price:Double,age:Int = 20) {
print("\(name),\(price),\(age)");
}
printPersonGreeting2(to: "rao", price: 20.0);
printPersonGreeting2(to: "jun", price: 30.0, age: 10);
//返回一个元组
func sortedEvenOddNumbers(numbers:[Int])->(events:[Int],odds:[Int]) {
var evens = [Int]();
var odds = [Int]();
for number in numbers {
if(number%2==0){
//是偶数
evens.append(number);
}else{
//是奇数
odds.append(number);
}
}
return (evens,odds);
}
let array = [10,1,4,3,43,85,27];
let tupe = sortedEvenOddNumbers(numbers: array);
print(tupe.events)
print(tupe.odds)
//返回可空类型
func gradMiddleName(fromFullName name:(String, String?, String))->String?{
return name.1;
}
var middle = gradMiddleName(fromFullName: ("rao",nil,"bo"))
if let middleName = middle {
print(middleName);
}
func sortedEvenOddNumbers(numbers:[Int])->(events:[Int],odds:[Int])
上面这个函数的类型,就是([Int])->([Int],[Int]),函数也可以当做一个变量存储。
func sortedEvenOddNumbers(numbers:[Int])->(events:[Int],odds:[Int]) {
var evens = [Int]();
var odds = [Int]();
for number in numbers {
if(number%2==0){
//是偶数
evens.append(number);
}else{
//是奇数
odds.append(number);
}
}
return (evens,odds);
}
let evenOdsFunction:([Int])->([Int],[Int]) = sortedEvenOddNumbers;//将一个函数用一个变量承接起来
let array = [10,1,4,3,43,85,27];
var evenOdds = evenOdsFunction(array);
print(evenOdds)
闭包
函数实际上是闭包的一种。
所有的函数实际上是一种闭包。暂时将闭包理解成一个匿名函数。
//函数形式
let volunteerSorted = [1,3,40,32,2,77,13];
func sortAscending(_ i:Int, _ j:Int)->Bool {
return i < j;
}
let volunteer = volunteerSorted.sorted(by: sortAscending);
//闭包完整形式
let volunteer2 = volunteerSorted.sorted { (i:Int, j:Int) -> Bool in
return i<j;
}
//闭包的缩略形式1
let volunteer3 = volunteerSorted.sorted { (i, j) -> Bool in
return i<j;
}
//闭包的x缩略形式2
let volunteer4 = volunteerSorted.sorted(by: {$0 < $1});
函数作为返回值
let volunteerCount = [1,3,40,32,2,53,77,13]
func makeTownGrand()->(Int,Int)->Int {
func buildRoads(lightsz:Int,existingLights:Int)->Int{
if(lightsz == existingLights){
return 0
}else if(lightsz > existingLights){
return lightsz;
}else {
return existingLights;
}
}
return buildRoads;
}
var result = makeTownGrand();//result是一个函数
print(result(10,10));
函数作为参数
闭包能捕获变量
闭包是引用类型
函数式编程
结构体
类
三:高级内容
协议
扩展
泛型
错误处理
四:内存管理和ARC
五:Object-C与Swift的交互