1优点:
Swift是由苹果公司在2014年推出的,用来写OSX和IOS程序
能看得到的好处:
一般都是一行一句代码,没有了分号; 运行速度更快;舍弃了Smalltalk语法,方法调用和枚举使用点语法,更加现代; 取消了OC指针;语言更加精简:没有.h和.m,没有main.m文件,在AppDelegate.Swift里 类的定义没有@implementation,使用大括号;当前对象如果访问的是自己的属性或者方法,self可以省略,但是在闭包里需要使用;添加事件,方法前不是@改为#,字符串没有@,打印使用print;有自动类型推导的功能,推导出变量的准确类型;没有隐式转换,不同类型的值做运算会报错,必须进行显式转换;可选类型,类型名后加?,可选值为nil,不允许参与计算;整数默认是Int,小数默认是Double;条件判断,还有switch,for循环;函数内部不能使用外部参数,外部参数都是给调用方用的,使调用方明白每个参数的意思;提供OC与Swift无缝转换
更加安全(譬如说,数据溢出的时候,会给出警告)
命名空间
泛型
支持方法重载(是面向对象的一个重要特征),oc不支持重载
没有非空即真或者非零即真,必须有明确真假
2学习方式
选择playground创建测试代码
3定义常量使用let 变量使用var 小数默认是double
4 let a = 10
let a : Int = 20 var b : Double = 2.44
强类型语言,任何一个标识符都有明确的类型
不指定类型,可以根据等号后边的值自动推导
指定类型的常量let c : Double = 20.5
let result = a + c 报错 在Swift里没有隐式转换
5定义数据类型,先使用let 再提示的时候改为var
定义格式:let /var 标识符名称 : 类型 = 赋值
6 可选类型:定义的常量或者变量可能有值,可能为nil(没有值),不能直接参与计算
只有可选类型才能接收 nil这个参数 let a : String = nil错误 可以这样,let a : String ? = nil
可选表现形式:类型名后加? let a : Int? = 10 let b = 20 let result = a! + b !表示强制解包
使用!向系统保证我的值一定存在,不能是 nil
实现:if a != nil {
let result = a! + b
print(result)
}
使用空合运算符: ??
let result = a + b
let result = (a ?? 0) + b
判断a是否有值,如果有值,直接使用a ,如果没有,直接使用默认值0,a是什么类型,默认值就是什么类型
有可能出现多次强制解包:
let url: URL? = URL(string:"http://www.baidu.com哈哈“)
if url != nil {
let urlRequest = URLRequest(url :url!)//出现多次强制解包
print(urlRequest)
}else {
print(url不合法”)
}
改进:使用if let语句 会先判断url是否为nil,如果不为nil,对u进行赋值,直接执行if let语句
if let u = url {
let urlRequest = URLRequest(url : u)//执行到此,表示一定有值,就不用再进行强制解包
print(urlRequest)
}else {
print("url不合法“)
}
再次改进:
另一种:guard let 守护的可选类型一定有值,否则不执行else语句
guard let u = url else {
print("不合法”)
return
}
let urlReuqest = URLRequest(url:u)//执行到此表示一定有值,不用强制解包
print(urlRequest)
多个可选类型的判断
let name: String? = "张三“
let age : Int? = 20
if let n = name,var a = age {//两个是并且的关系
a = 21
}}
多个条件判断,iflet 可以加上条件判断
if let u = url, u.host == "www.baidu.com" {
print(”我是百度“)}
多个可选类型,多个条件的判断
let name: String? = "张三”
let age : Int? = 20
if let n = name,let a = age,n == "张三“&& a== 20{
print("名字:\(n),年龄:\(a)")
}
常见错误:
fatal error:unexpectedly found nil while unwrapping an Optional value 对可选类型值为nil进行强制解包报错
变量可选类型默认值是nil var d : Int?
常量可选类型没有默认值,使用的时候必须初始化,可以初始化为nil let f : Int ? = nil
7控制流:
没有非0即真 if num { } 必须是一个bool类型值,只有true/false if num > 5 {}
三目运算符:var a = 10; var b = 20;let c = a > b ? a : b
8Switch
没有break,可以判断任意数据类型;可以省略小括号;在case里定义变量不需要添加括号;判断多个参数;fallthrough case后不能定义常量或者变量;case或者default后必须跟一条可执行语句,(break也行)
let score = 90
switch socre{
case let x where x >90:
print("优秀”)
或者
case _ where score > 90:
没有for循环,只有for-in ,repeat-while
o..<5范围[0,5) 0...5[0,5]
do-while改为 repeat-while
9String关键字,是一个结构体,量级比NSString 轻,性能更好
let str = "hello" var str: String = "你好"
获取字符串的长度:
let length = str.characters.count
Swift里String与NSString 可以做无缝转换:使用as
let len1 = (str as NSString).length
拼接: let result = str1 + str2; str3 += swift str3 += String(year)
整形转化为字符串拼接
let message = result + "\(year)"
let month: Int? = 5
let message2 = ”今年是第\(month!)个月"
let infoStr = “my name is \(name),age is \(age),height is \(height)”
格式化拼接:let min = 3 ; let second = 12 ; let timeStr = String(format:"%02d:%02d",min,second)
字符串截取
方式一:转换为oc NSString
let urlString = “www.520it.com”
let header1 = (urlString as NSString).substring(to:3)
10函数
在类里写 叫做方法
func demo(){
print("午餐午饭”)
}
func demo1() -> Void {
print("无返回值的方式2")
}
func demo2()->() {
print("无返回值的三种方式”)
}
嵌套函数:只能在函数的内部使用,外部访问不了
func show(){
func demo1() {
print(“哈哈”)
}
demo1()
}
有参有反
func sum(a:Int,b:Int) ->Int{
return a + b
}
外部参数和内部参数
函数内部不能使用外部参数,外部参数都是给调用方用的,使调用方明白每个参数是什么意思
func mul (num1 a : Int,num2 b : Int) -> Int {
return a * b
}
11闭包:let closure = { (参数名:参数类型,。。。)->返回值类型 in
//执行代码 in 用来区分函数定义和代码实现
}
无参无返回值的闭包:
func demo1(){
let closure = {
print("哈哈“)
}
func demo2(){
let closure = {() in
print("hah ")
}
let closure1 = {()-> Void in
print(”哈哈“)
}
let closure2 = {()->() in
print("哈哈”)
}
closure()
}
有参有返回值的闭包
func demo3() {
let closure = {(num1 : Int, num2 : Int) -> Int in
return num1 + num2
}
let result = closure(10,10)
print(result)
}
12as 类型转换
、