向控制台輸出文本log
print("hello world")//輸出純字符串
print("1 + \(1) =?")//輸出字符+數字的組合 這裡使用了字符串插值`\()` 括號內可以接受任何內容 輸出結果:1 + 1 =?
var a:floata: = 2.1
print("1 + \(a)") //輸出字符+變量 輸出結果:1 + 2.1
聲明一個變量.變量表示可以修改的數據類型 可以賦值多次
例子:
var a:Int = 0
a = 100 //可以再次賦值
var b:NSObject = NSObject()
聲明一個不可變的常量,只能賦值一次
例子
let a:Int = 0
a = 100 //這句代碼會報錯 不可以再次賦值
條件並非必須在小括號中 條件必須是明確的true或者false 0或非0 並不會隱式的轉換為true或false,nil和非nil同樣不會隱式轉換 執行語句必須包含在大括號中條件判斷語句,和OC中得語法主要有三點區別
例子:
let a:Int = 0
if a = 0 {
//條件成立執行
a = 100
}else{
//條件不成立執行
a = 50
}
關鍵字:
switch 判斷語句首要關鍵字 case 節點關鍵字,每個判斷的節點使用 fallthrough 不跳出判斷,繼續向下執行 default 例外,沒有條件成立時執行此語句 where 判斷子語句 相當於if
語句中得&&
在swift中switch語句默認只匹配一個case這和其它類C語言不通,類C語言中,如果不使用關鍵字break,那麼將執行匹配到的case節點下面所有的代碼,而在swift中,不需要break語句來進行跳出,默認原則就是只執行匹配到的節點與下個節點之間的代碼.並且不需要大括號進行包裹,如果想執行後面的語句可以加上fallthrough語句.
let a = 0;
switch a {
case 0://遇到節點 匹配相同 條件成立 執行後面的語句
print("0") //輸出0
fallthrough //執行下一個節點中得內容
case 1: //匹配失敗 這個條件並不成立 但是也會執行,因為上一句中得關鍵字fallthrough 所以這個節點中得代碼被執行了
print("1")//輸出1
case 2: //匹配失敗 不執行
print("2")
default: //默認節點 不執行
print("3")
}
輸出結果
0
1
在swift中switch語句更加的強大,不僅能判斷進行普通的常量匹配還支持范圍匹配,元祖
匹配,和where子語句匹配.
1.范圍匹配
let a = 5;
switch a {
case 0...10://匹配a是否在0 - 10這11個值之內
print("0")
case 0..<10://匹配a是否在0 - 9這10個值之內 雖然條件成立但是由於第一個條件已經成立所以這裡不會進入判斷
print("1")
default:
print("2")
}
輸出結果:
0
2.元組匹配
let a = (1,2,"A");
switch a {
case let b://配皮元祖 絕對匹配的寫法
print("\(b.0)")//輸出元組的第一個參數 這裡輸出:1
case (1,2,let c)://匹配第一第二個參數,將第三個參數賦值給c
print("\(c)")//這裡輸出:A
case (_,let c,"A")://第一個參數忽略匹配,第二個參數賦值給c 匹配第三個參數"A"
print("\(c)") //這裡輸出:2
default:
print("2")
}
輸出結果:
1
更多方法可以參考元祖的使用
3.where語句
let a = 1;
switch a {
case 1 where false://匹配是否為1 並且where後面的bool值為true 這裡條件不成立所以不會運行
print("1")
case 1 where a == 1://這裡匹配成功並且 where後面值也為true 所以下面代碼會運行
print("2")
}
輸出結果:
2
附注:
swift中switch默認只匹配一個case,如果需要匹配多個則需要加上fallthrough
關鍵字 swift中switch沒有break
,如果在switch中使用break
,不是跳出switch而是跳出更外層的范圍.
與oc相比不需要對循環條件加括號了,新增區間運算符
...
和..<
代替了i = 0 i < 10 i++
這種形式
for i in 0..<10{ //0..<10 表示0-9的數字 這是半開區間,還一種全開區間0...10 表示0-10的數字
print("i = \(i)")
}
效果等同於:
for var i = 0;i < 10; i++{
print("i= \(i)")
}
同樣for - in形式可以用於數組,和OC相同,由於swift是強類型語言並且支持類型推斷,所以在for- in中可以不去聲明類型
var a:[Int] = [1,2,3,4,5]
for i in a{
print("i = \(i)")
}
輸出結果:
i = 1
i = 2
i = 3
i = 4
i = 5
是不是比oc簡單的多
和oc基本沒有區別,條件無需小括號
var a = 1;
while a < 10{
a++
print("a");
}
//這個循環首先會判斷a是否小於10 條件成立才進入循環塊中執行代碼,每執行一次判斷一次,直到條件不成立才會繼續向下運行
var a = 1;
repeat{//swift中 do換成了repeat 作用一樣
a++
print("a")
}while a < 10
//這個循環會首先進入代碼塊執行一遍塊中的代碼,然後再進行條件判斷
關鍵字 break
這個關鍵字可以強制跳出循環.continue
終止當前循環,開始下一次的循環.
var i:Int = 0;
repeat{
i += 1
if i >= 10 {
break //當條件成立時 跳出當前循環 執行循環後面的代碼
}
if i%2 == 0{
continue //當條件成立時 結束當前循環,進行下一次循環
}
print("i = \(i)")
}while true //死循環
print("end")
輸出結果:
i = 1
i = 3
i = 5
i = 7
i = 9
end
在swift中,基本數據類型也擁有各自的方法.通過方法可以對數據進行更改.比如Int.min
就能得到Int所能儲存的最小值a.hashValue
a是整數 可以得到哈希值 swift是一個強類型語言,任何類型的值都不能隱式的轉換成另外一種類型,需要轉換時可以使用Int(b)
講b顯式的轉換成Int類型
只能儲存整數,默認推斷類型為Int
var a = 10 //a是Int類型的
Int.max //取一個最大得值
Int.min //取一個最小的值
默認推斷類型為Double類型,Float32位 Double64位與設備的架構無關
var f:Float = 2.2
在swift中,0不代表false 非0也不代表true nil也不會等於false 所以的值都是唯一類型的,無法隱式的轉換.所以說if(1)這樣的寫法也將不可用
swift中添加了新的字符串類型string 如果使用cocoa庫的話NSString依舊可以使用.string是Character類型值得集合,每個Character代表一個Unicode字符.因為每個字符大小不同,所以無法通過string占用內存大小來獲得字符串的長度.
//創建
var str:String = "asA中??"
//獲取長度
print(str.characters.count); //輸出結果:5
//字符串拼接
let newStr = str + "123"
print("拼接後的字符:\(newStr)") //輸出結果:asA中?123
//字符串追加
str += "456"
print(str) //輸出結果:asA中?456
//取首字符
print(str.substringToIndex(str.startIndex.advancedBy(1))) //輸出結果:a
//取尾字符
print(str.substringFromIndex(str.endIndex.advancedBy(-1))) //輸出結果:6
//取字符中間
let start = str.startIndex.advancedBy(1)
let end = str.endIndex.advancedBy(-1)
print(str[start...end]) //輸出結果:sA中?456
//取字符在字符串中的位置
let r:Range? = str.rangeOfString("sA")
print(r!) //輸出結果:1..<3
//刪除字符
str.removeRange(r!)
print(str) //輸出結果:a中?456
//遍歷字符
for c in str.characters {
print(String(c))//依次輸出:a, 中, ?, 4, 5, 6
}
//比較字符
let a = "a"
let b = "b"
print(a == b) //輸出結果:false
在string中,於NSString的使用方法有了很大的不同,語法更加簡潔,更加貼合數值類型的操作習慣,支持范圍區間符號
...
非常方便的就能獲取范圍,字符串的拼接和追加也不再需要代碼直接使用+
號就能完成.同時比較字符串和遍歷字符串使用起來也非常的方便.
首先和oc中不同的是,swift數組可以儲存任何類型,包括基本數據類型如:Int,String等,再者swift數組只能儲存相同的數據類型,這樣可以確保從數組中獲得的數據類型是一致的,從而避免一些錯誤.
//創建
var array1:[String] = ["a","b","1"]
var array2:[String]
var array3:Array = [1,2,3,5]
//查詢下下標
array1.count //輸出結果為:3
//遍歷
for a in array1 {
print(a) //依次輸出:a, b, 1
}
//增加
array1.append("c") //array1結果為:["a","b","1","c"]
//刪除
array1.removeAtIndex(1) //array1結果為:["a","1","c"]
//取元素
print(array1[0]) //輸出結果為:a
//取范圍內元素
print(array1[0...2]) //輸出結果為["a","1"]
//替換元素
array1.insert("z", atIndex: 0) //array1結果為:["0","1","c"]
//判斷是否為空
print(array1.isEmpty) //輸出結果為:false
需要注意的是,在數組中如果儲存的值是基本類型,結構體或枚舉則數組將數據
copy
到數組中,修改外部數據或數組中的數據是不會對另外一方造成影響的var a = 1,b = 2,c = 3,d = 4 var all:Array
= [a,b,c,d] a = 11 print(all[0])//雖然a的值變成了11 但是對數組中的數據沒有影響 這裡輸出:1 如果是類對象,則是引用到數組中,對任何一方的改變都會影響到另外一方的值.
var a:UIView = UIView() let all = [a] print(all[0].tag)//輸出結果:0 a.tag = 1 //修改a.tag的值,數組第一元素的tag值也會跟著改變 print(all[0].tag)//輸出結果:1
在swift中,任何遵循Hashable協議的類型都可以作為字典的key,而所有的基本類型都遵循Hashable,所以它們都可以作為key來使用,而oc中只有NSString類型可以作為key.字典可儲存的類型和Array相同都可以儲存任何形式的值.不同於OC中的字典只能儲存NSObject對象.
//創建
var dic = ["a":1]
var dic1:Dictionary = [:]
var dic2:[String:Int] = Dictionary()
//獲得元素數量print(dic.count)
//遍歷數組
for (str,number) in dic {
print(str + " " + String(number))
}
//添加元素
dic["b"] = 2
//刪除元素
dic.removeValueForKey("a")
//更改元素
dic["b"] = 3
//通過key獲取值
print(dic["b"]!)
注意:字典中的
value
值是可空屬性,所以需要使用!
來強制解包,當然為了安全起見每次強制解包之前都需要判斷一下是否為空.