常量
定义常量的方法
- 我们先看一下最完整的定义常量的书写格式:
let 常量名称 : 常量类型 = 初始化值;
例:
let name : String = "lyu";
let age : Int32 = 18;
...
- Swift中的类型推导(不是推倒,别激动):
如果在定义变量(或常量)的同时进行赋值(即完全初始化),那么变量(或常量)的类型可以省略,并且Swift会根据我们的赋值推导出变量(或常量)的类型,如下:
let n = 10 //实际上,现在这个n已经有了明确的类型int
- 定义常量的快捷方法:
Swift中如果一行中只有一句代码的时候允许省略末尾的分号;,再加上Swift的类型推导让我们定义常量变得更加便捷,如下
let 常量名称 = 初始化值;
例:
let name = "lyu"
let age = 18
拓展:
Swift是一个强类型的语言,它的任何一个标识符都必须有明确的类型,如果一个变量(或常量)没有明确的数据类型则编译报错,如下:
错误写法:
let height //系统无法推导height的数据类型
正确写法:
let height : Int32
变量
定义变量的方法
- 依旧先看一下最完整的定义常量的书写格式:
var 变量名称 : 变量类型 = 初始化值;
例:
var name : String = "lyu";
var age : Int32 = 18;
...
- 定义变量的快捷方法:
原理与定义常量相同,如下:
var 变量名称 = 初始化值
例:
var name = "lyu"
var age = 18
...
- tips:
- 建议初学者优先使用常量进行定义,当明确某一个常量需要修改的时候,在将其定义为变量
- 常量的本质是指向的内存地址不可以修改,但是当我们通过内存地址拿到一个实例化对象的时候,是可以通过内存地址来修改对象的内部属性的,例如:
let view : UIView = UIView(); //实例化对象
view.frame = CGRectMake(100, 100, 100, 100); //虽然view是一个常量,但是我们仍然可以修改它指向的对象的属性
错误写法如下:
view = UIView(); //无法使view指向一个新的对象
对象
实例化对象的方法
什么?实例化对象要先写new?要alloc+init?你out了,Swift中实例化对象非常之简单,我们简单看两个例子:
例1 view:
//下面简单介绍三种创建UIView的方法
let view : UIView = UIView() //相当于java中的new
let view : UIView = UIView.init(frame : CGRectMake(1,1,1,1)) //相当于OC中的initWithFrame
let view : UIView = UIView(frame : CGRectMake(1,1,1,1)) //相当于OC中的initWithFrame
//修改属性
view.alpha = 0.8
view.backgroundColor = UIColor.redColor() //随意修改一些属性值,但是Swift中取消了smallTalk机制,一并换成了.点语法
//实例化UIButton对象的方法,对比其Swift中枚举值的两种写法
let button : UIButton = UIButton(type: UIButtonType.Custom) //枚举值写法的改变(枚举类型.具体类型)
let button : UIButton = UIButton(type : .Custom) //枚举值的简便写法
//修改button的属性
button.setTitle("按钮",forStatus: .Normal)
//将button添加到父控件
view.addSubview(button) //添加控件
例2 controller:
let VC : UIViewController = UIViewController()
let navigationController : UINavigationController = UINavigationController(rootViewController:VC) //初始化rootViewController
实例化对象的方法大致如此
Swift的基本数据类型
这里大致介绍一下整型,以后有机会再补充吧...
Int8 : 有符号8位整型(相当于C语言中的char)
Int16 : 有符号16为整型(相当于C中的short)
Int32 : 有符号32为整型(相当于C中的int)
Int64 : 有符号64为整型(相当于C中的long)
Int : 默认,与平台相关(例如:OC中的NSInteger)
UInt8 : 无符号8位整型(相当于C语言中的unsigned char)
UInt16 : 无符号16为整型(相当于C中的unsigned short)
UInt32 : 无符号32为整型(相当于C中的unsigned int)
UInt64 : 无符号64为整型(相当于C中的unsigned long)
UInt : 默认,与平台相关(例如:OC中的unsigned NSUInteger)
基本运算
- Swift中的数据类型没有隐式类型转换(*隐式类型转换是指在C/OC等语法中,int类型与double类型进行运算时,系统自动将int类型提升至double类型,再进行运算)
错误写法:
let a = 32
let b = 1.0
let sum = a + b //编译报错
- Swift中的类型转换:
数据类型(变量名)
如,上面反例的正确写法如下:
let a = 32
let b = 1.0
let sum = a + Int(b) //结果为33,整型
错误写法:
let sum = a + (Int)b //Swift与OC刚好相反,小括号要将变量括起来,而不是标识符
if逻辑分支
- Swift中if语法的注意点
- if后面的()可以写也可以不写,但是为了简洁开发,通常都不写
- if的判断语句没有非0(非空)即真,也就是说if后面的判断语句必须有明确的真假
- Swift中有明确的真假类型Bool,取值为ture或false,与java相同
- if后面的{}必须写,与C或OC不同
例:
正确写法:
let age = 18
if age < 18{ //就算大括号中只有一句话,也不可以省略大括号
print("未成年")
}
else{
print("成年")
}
错误写法:
if age{}
if 1{}
//if后面必须有明确的真与假,所以上面做死循环的方法不可取,死循环正确的姿势如下:
if age == 18{}
guard逻辑分支
Swift中的新型条件判断语句guard(守卫,名字屌爆有木有),旨在提高代码的可读性,取代if的多层判断,基本用法如下:
guard 条件语句 else{
结束语句 //break(switch或循环中使用)/continue(循环中使用)/return(函数中使用)
}
- 语法解释:
- 条件成立,则跳过else继续执行
- 条件不成立,进入else执行代码,而else必须包含结束语句,用于跳出当前的循环或函数,这是为了保证后面的代码不执行
func ageIf(age : Int , sex : Int){
guard age < 18 else{
return
}
guard sex == 1 else{
return
}
print("做我女朋友")
}
let age = 16
let sex = 1
ageIf(age, sex: sex)
keyMessage:guard多用在自定义函数或循环中
switch逻辑分支
重头戏来了,Swift中的Switch不再那么鸡肋,反而变得很强大,这点要与C和OC中区分开
- Swift中Switch的基本用法:
- switch后面的()可以写也可以不写
- case结束后可以不加break,不会穿透
- 如果想要执行穿透效果,需要在case结束后添加一条语句:fallThrough
- case后面可以判断多个条件,多个条件需要以,分隔
例:
let sex = 1 //1:代表男 2:代表女
switch sex {
case : 0 , 1
print("正常人")
default:
print("不正常人")
}
- 还没完呢
- switch可以判断浮点型数据,字符串类型数据
switch option {
case "+":
result = a + b
case "-":
result = a - b
case "*":
result = a * b
case "/":
result = a / b
default:
print("错误")
}
- switch可以判断区间
Swift中支持的两种区间:
半开半闭区间:1..<10 表示数学中的:[1,9)
闭区间:1...10 表示 [1,10]
let age = 18
switch age{
case 0..<18:
print("未成年")
case 18...30:
print("青年")
default:
print("老年")
}
for循环
- for循环的几种写法如下:
- for后面的小括号可以省略
for var i = 0;i < 10;i++{ //一般用于从后往前遍历,过期方法,不建议使用
print(i)
}
- 区间循环(做不到倒序遍历):
for i in 0..<10{ //此时的i被推导为int类型
print(i)
}
- 如果不需要i,可以使用下划线来替代
for _ in 0..<10{
print("hello")
}
while循环与"新版doWhile"循环(repeatWhile)
while循环
- 依旧可以省略while后面的()
- 依旧没有非0即真和非空即真
错误写法:
while(1){}//报错
死循环的正确姿势:
while(1!=0){}
repeatWhile(doWhile)
- while后面的()可以省略
- 没有非0即真和非空即真
- do换成了repeat
var count = 0
repeat{
print("hello")
count += 1
}while count < 10
字符串/数组/字典
相比于OC中的字符串/字典/数组,Swift统一去掉了NS
- NSString改为String
- NSArray改为Array
- NSDictionary改为Dictionary
提示:
不要以偏概全哦:例如OC中的NSDate在Swift中仍然是NSDate...
字符串String
- Swift中字符串的特点:
- String是一个结构体,相对于对象(NSStrign)来说性能更高
- String支持直接遍历
- Swift提供了String和NSString之间的无缝转换
- 创建字符串:
- 可变字符串
let str = "hello"
- 不可变字符串
var strM = "hello"
strM = "hello swift"
- 字符串的使用
- 遍历字符串
for character in str.characters {
print(character)
}
- 获取字符串长度
let length = str.characters.count
- 字符串的拼接
- 字符串与字符串之间的拼接
let str = "lyu"
let str2 = "sim"
let str3 = str + str2
print(str3)
- 字符串与其他标识符之间的拼接
let name = "lyu"
let age = 18
let str3 = "name is \(name) and age is \(age)"
print(str3)
- 字符串与其他标识符之间的格式化拼接
let str = "lyu"
let age = 18
let str3 = String(format: "name is \(str) , age is %i" ,age)
- 字符串的截取
- 使用Swift原生方法截取�
let urlString = "www.lyu.com"
//由于Swift中substringWithRange中的range泛型指定为Index类型,所以才导致创建区间如下面这般麻烦
let startIndex = urlString.startIndex.advancedBy(4) //创建区间起始
let endIndex = urlString.endIndex.advancedBy(-5) //创建区间末尾
let range = Range(startIndex...endIndex) //创建区间
let name = urlString.substringWithRange(range) //截取中间
let www = urlString.substringToIndex(startIndex) //截取到...
let com = urlString.substringFromIndex(endIndex) //从..开始截取
- 使用OC方法截取
let urlString = "www.lyu.com"
let name = (urlString as NSString).substringWithRange(NSMakeRange(4, 3)) //转换字符串,并使用OC方法来进行截取
let com = (urlString as NSString).substringFromIndex(8)
let www = (urlString as NSString).substringToIndex(3)
数组
- 不可变数组:
let array = ["lyu","sim"]
- 可变数组:
var arrayM = Array<NSObject>() //不常见的写法,只因不够简洁
var arrayM = [NSObject]()
- 数组的基本操作(增删改查)
- 增
arrayM.append("lyu") //增加字符串
arrayM.append(18) //增加基本数据类型
- 删
arrayM.removeAtIndex(1) //18被删除掉了
- 改
arrayM[0] = "sim"
arrayM[1] = "18" //此例中,越界报错
- 查
let name = arrayM[0] //取出数组的第0个元素
- 数组的遍历
- 普通for循环遍历:这种方法在Swift 3.0中即将被取消,请遗忘
let array = ["lyu" , 18]
for var i = 0 ; i < array.count ; i++ {
print(array[i])
}
- 增强for循环遍历:
let array = ["lyu" , 18]
for name in array {
print(name)
}
- 超强for循环遍历:既能拿到index,又能拿到元素(简直碉堡)
let array = ["lyu" , 18]
for (index , name) in array.enumerate(){
print(index)
print(name)
}
- 部分遍历:如果有只遍历数组中某部分元素的需求,那么就使用下面这种方法吧
let array = ["lyu" , 18]
for index in 0...1 {
print(array[index])
}
- 数组的合并
数组的合并是有前提的:两个数组中对应index的元素类型必须一致,才能进行合并
正确写法:
let array1 = ["name1" , 17]
let array2 = ["lyu" , 18 , 19 , "sim"]
let arrayT = array1 + array2
错误写法:
let array1 = ["name1" , 17]
let array2 = ["lyu" , "sim"]
let arrayT = array1 + array2 //编译报错
字典
不可思议的是,Swift中的字典仍然使用[]来创建(而不是{}),Swift会通过[]中的内容来判断自己是一个字典还是数组(如果里面存放的是键值对,Swift会判定其为字典,如果里面存放的是元素,Swift会判定其为数组)
- 不可变字典
let dic = ["name" : "lyu" , "age" : 18]
- 可变字典
var dicM = Dictionary<NSString , NSObject>() //不常用
var dicM = [NSString : NSObject]()
- 可变字典的基本操作
- 增
dicM["name"] = "lyu" //第一种方法
dicM.updateValue(18,forKey:"age") //第二种方法
keyMessage:如果key已经存在了,那么所谓的增就变成了改了哦
- 删
let name = dictM.removeValueForKey("age") //Swift中被删除掉的元素是可以拿到的
- 改
dictM["name"] = "lyu"
dictM.updateValue("lyu",forKey:"name")
- 查
let name = dicM["name"]
- 字典的遍历
- 遍历key
for key in dic.keys {
print(key)
}
- 遍历value
for value in dic.values {
print(value)
}
- 遍历key/value:
for (key , value) in dic {
print(key)
print(value)
}
- 字典的合并:
然而,字典并不能合并,就算元素类型相同也不可以,不过如果真的有让两个字典合并为一个字典的需求,可以这样做:
let dic = ["name" : "lyu" , "age" : 18]
var dicM = [NSString : NSObject]() //将其中一个字典变为可变字典,作为被合并的字典
dicM["height"] = 1.80 //为可变字典添加属性
for (key,value) in dic { //合并字典
dicM[key] = value
}