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 類型轉換
、