雖然Swift這門語言還很年輕,但是不可否認(rèn)的是Swift很強大,也很便捷,但是習(xí)慣于OC編程之后再去寫swift難免會覺得別扭,今天有時間,我就來把Swift的一些知識點加以整理,也便于自己以后查閱和重新溫習(xí),爭取每天一篇,第一天就從最基礎(chǔ)的開始整理
首先是新建一個swift工程,這個和OC是一樣的,只不過在建的過程中把OC語言改成swift,這里就不再贅述
1.swift的基本操作
1.字符串操作
在swift中 let表示常量 var 表示變量
let str = "hello"
//長度str.characters.count
//長度 str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
//大小寫轉(zhuǎn)換
//str.uppercaseString
//str.lowercaseString
//相等 ==? 拼接 +
//插入 "123\(str)4567"
//格式化創(chuàng)建字符串 加占位符的
let str3 = String(format: "%02d:%02d", arguments: [1,2])
let str2 = String(format: "%02d:%02d", 1,2)
print(str2)
print(str3)
//字符串的其他操作全部轉(zhuǎn)換為NSString再去操作
//轉(zhuǎn)換 的方法
let str4:NSString = str2 as NSString
2.數(shù)組的操作
Swift的數(shù)組和OC的數(shù)組可以互相轉(zhuǎn)化
//不可變數(shù)組
let array1 = ["A","3","C"]
//可變數(shù)組
var mutableArray = [String]()
//往數(shù)組中添加元素
mutableArray.append("world")
在這里要說一下的是這個 let array= [String]()
這個式子表示的是 初始化一個存放字符串類型的空白數(shù)組
()代表初始化 OC里的initWith/init 在swift里面全部轉(zhuǎn)化成()
在對數(shù)組操作有個要注意的點
1.for -in遍歷數(shù)組的時候一定要明確的指出數(shù)組的類型
for temp in array1 as [String]{
print(temp.characters.count)
}
2.元組遍歷數(shù)組中的值
for (index, value) in array1.enumerate()
{
print("index = \(index),value = \(value)")
}
3.字典的操作
在OC中字典要用 {} 表示 但是在swift中我們依然用[ ] 表示字典,這是一個不想同的點
1.不可變字典
let dict = ["key1":"value1","key2":"value2","key3":"value3"]
//通過key值訪問value值
print(dict["key1"])
1.1 for-in 元組遍歷字典的時候和數(shù)組有不同的地方,不用在后面加枚舉,直接遍歷即可
//for -in 遍歷 (不用在后面加枚舉)
for (key,value) in dict
{
//print("key = \(key), value = \(value)")
}
2.可變字典
var dict2 = ["key":"value"]
2.1如果可變字典合并另一個字典
這里要注意的時 如果key存在于原字典則是一個更新鍵值對的操作,否則是增加鍵值對操作
//合并
for (key,value) in dict
{
dict2[key] = value
}
4. 可選類型 封包 解包
//如果一個值可能為nil,那么這個值就是可選類型,用?標(biāo)識
//Optional包圍的就是可選類型
//可選類型不能直接使用,必須進行強制解包,!強制解包,對nil進行強制解包就會崩潰
如果swift出現(xiàn)了這個錯誤 fatal error: unexpectedly found nil while unwrapping an Optional value
那么原因就是對一個空的可選類型進行強制解包
下面舉個例子
var a1:String?
a1 = "皮卡皮卡"
print(a1!.characters.count)
補充:有人經(jīng)常會看到這樣的語句 (a1 ?? "123") 這個語句是什么意思呢
這個語句的意思就是對可選類型進行判斷,如果為空就給一個值"123",這是對可選類型進行一個保護讓它解包時不至于崩潰
print((a1 ?? "123").characters.count)
5. 判斷
1.if判斷
swift的if判斷和OC有兩點的不同
1.1 if 條件語句()可省略,{}不能省略
1.2 判斷沒有非零即真的概念,只有true false的兩種情況這樣可以使判斷更準(zhǔn)確效率更高更有針對性
let tempValue = 10
if tempValue > 5
{
print("這很Swift")
}
2.三種可選類型的條件分支
2.1 if-let
if-let 是對可選類型的判斷,如果可選類型為空,則不執(zhí)行代碼塊,如果不為空時,用tempStr來接收此刻這個可選類型的解包后的值 只能判斷可選類型
let string:String? = "比比鳥"
if let tempStr = string
{
print(tempStr)
}
2.2 if-let-where
跟 if-let 相似,where是對前面定義的這個局部變量再做一層判斷
如果不為空且位數(shù)大于2
let string:String? = "比比鳥"
if let tempStr1 = string where tempStr1.characters.count > 2
{
print("tempStr1.length = \(tempStr1.characters.count)")
}
?2.3 guard-let-else(守護)
跟 if-let 相反 如果可選類型str為nil,則執(zhí)行代碼塊,最后一定要return,如果不為nil則強制解包后的值賦值給tempStr,這樣在{}外面就可以使用tempStr
let str:String? = nil
guard let tempStr = str else
{
print("str = nil")
return
}
print(tempStr)
3.switch
在這里我們也著重注意下swift中的switch和OC中的switch的區(qū)別
3.1 在swift中
(1).switch不局限判斷整型,可以是浮點型,也可以是字符串等等
(2).switch 后面的小括號可以省略,大括號不能省略
(3).case后面至少要有一條執(zhí)行語句,并且case后面的大括號可以省略,break可以不寫,不會造成貫穿
(4).default一定要寫,且只能寫在最后
寫法為
let f = 3.2
switch f
{
case 3.0:
print("湊數(shù)的判斷語句")
case 3.1:
print("這還是一個湊數(shù)的")
case 3.2:
print("這又是一個湊數(shù)的")
default:
print("這是default的判斷語句")
}
6.循環(huán)
因為OC的while和do while和swift相差并不大所以就不再贅述 我簡單總結(jié)下for循環(huán)
下面的寫法雖然最熟悉但是這個寫法在2.2版本已經(jīng)廢棄了
for (var i = 0;i < 5;i++){
}
現(xiàn)在我的swift的寫法是這樣的 但是好像最新版本的swift好像也會報錯,這個我等會看一下
for var i = 0 ; i < 10 ; i++
{
print(i)
}
2種for in循環(huán)
注意區(qū)分兩者的不同 差別在" ."? 和 "< "
這是0-4的遍歷
for i in 0..<5
{
print("i = \(i)")
}
這是0-5的遍歷
for i in 0...5
{
print("i = \(i)")
}
7.枚舉
老規(guī)矩,先對比OC來看
相對于OC來說swift的枚舉更加強大 swift的枚舉值可以關(guān)聯(lián)浮點型,字符串,并且沒有默認(rèn)的關(guān)聯(lián)值
注意觀察下面兩個代碼的差別
關(guān)聯(lián)如果是int,會默認(rèn)的遞增上去,如果不是int類型的話,必須每個枚舉值都關(guān)聯(lián)上
enum Month:Init
{
case January = 3
case February
case March
case April
}
enum Month:Float
{
case January = 11.2
case February = 12.2
case March = 13.2
case April = 14.2
}
調(diào)用枚舉
如果明確指出一個變量/常量是屬于哪種枚舉類型的話,可以直接.枚舉值賦值,否則就 枚舉類型.枚舉值
let month = Month.April
let month1:Month = .January
switch month
{
//hasValue 代表第幾個枚舉
case .January:
print("hasValue = \(month.hashValue),rawValue = \(month.rawValue) ")
print(month)
case .February:
print("hasValue = \(month.hashValue),rawValue = \(month.rawValue) ")
print(month)
case .March:
print("hasValue = \(month.hashValue),rawValue = \(month.rawValue) ")
print(month)
case .April:
print("hasValue = \(month.hashValue),rawValue = \(month.rawValue) ")
print(month)
}
2.常用swift的操作
1.懶加載
swift的懶加載格式為
lazy var 變量名:變量類型 = {
code 初始化
return
}()
以 初始化一個button為例
lazy var btn:UIButton = {
var tempBtn = UIButton(type:UIButtonType.ContactAdd)
tempBtn.frame = CGRectMake(90,100,50,50)
tempBtn.backgroundColor = UIColor.cyanColor()
return tempBtn
}()
2.閉包
閉包是自包含的功能代碼塊,可以在代碼中使用或者用來作為參數(shù)傳值。
在Swift中的閉包與C、OC中的blocks和其它編程語言(如Python)中的lambdas類似。
閉包格式? 閉包作用回調(diào)傳值
var 閉包變量 ={
(參數(shù)名:參數(shù)類型)-> 返回值類型 in
代碼塊
}
具體實現(xiàn)
//無參無返
let closure = {
()->()//() -> void , ()
in
print("無參無返")
}
closure()
//有參無返
let closure1 = {
(tempStr1 str:String,tempStr2 str2:String) -> ()
in
print("有參無返")
}
closure1(tempStr1: "hello",tempStr2: "world")
//無參有返
let closure2 = {
() -> String
in
print("無參有返")
return "aaaaa"
}
print(closure2())
//有參有返
let closure3 =
{
(str:String) -> Int
in
return 32
}
print(closure3("給我打印個數(shù)吧"))
3.方法 的聲明和實現(xiàn)
格式
func 方法名(參數(shù)列表) ->返回值類型{
}
具體的實現(xiàn)代碼
func text(str:String) ->String
{
return "有參有返"
}
func text1()->String
{
return "無參有返"
}
func text2()
{
print("無參無返")
}
func text3(str:String)
{
print("有參無返")
}
print(text("啦啦啦"))
print(text1())
text2()
text3("哈哈哈哈")
把閉包作為參數(shù)的方法實現(xiàn)示例
假如我們要實現(xiàn)兩個string的拼接
首先聲明一個方法在方法內(nèi)部執(zhí)行閉包
func combineString(str1:String,str2:String,closure:(tempStr1:String,tempStr2:String)->String)
{
//執(zhí)行閉包
let string =? closure(tempStr1: str1, tempStr2: str2)
print(string)
}
調(diào)用的時候?qū)崿F(xiàn)函數(shù)
combineString("hello", str2: "world") { (tempStr1, tempStr2) -> String in
return "\(tempStr1) \(tempStr2)"
}
4.單例的創(chuàng)建
首先創(chuàng)建一個繼承與NSObject的類 因為swift沒有 .h文件所以直接就在文件中創(chuàng)建單例
創(chuàng)建單例有兩種寫法
寫法1
var name:String?
?static var shareSingleDog:singleDog = {
? let instance = singleDog()
?? return instance
寫法2
static let instance = singleDog()
static func shareSingleDog()->singleDog{
return instance
}
寫法1的調(diào)用
let s1 = singleDog.shareSingleDog
s1.name = "皮卡"
let s2 = singleDog.shareSingleDog
print(s2.name)
寫法2的調(diào)用
let s3 = singleDog.shareSingleDog()
s3.name = "水箭龜"
let s4 = singleDog.shareSingleDog()
print(s4.name)
5.KVC異常捕獲
在OC中我們經(jīng)常使用KVC在swift中也有需要注意的點
1.字典轉(zhuǎn)模型
(1)新建模型類 以person為例
var name:String?
var age:Int = 0
var gender:String?
這里需要注意模型中如果有基本數(shù)據(jù)類型的話,基本數(shù)據(jù)類型不可以為可選類型,否則在KVC賦值中會找不到對應(yīng)的key值.如果為可選類型的話必須給個初始值
(2)重寫初始化方法
init(dict:[String:AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
重寫完初始化方法后,系統(tǒng)自帶的默認(rèn)初始化方法就不能被調(diào)用,如果還想調(diào)用默認(rèn)的初始化方法則需要寫下以下的方法
override init() {
}
(3)外界字典轉(zhuǎn)模型
let dict = ["name":"zhangsan","age":12,"gender":"男"]
let person = Persone(dict: dict)
//let person = Persone() (系統(tǒng)自帶的初始化方法)
print(person.name)
print(person.age)
print(person.gender)
2.解析
1.獲取路徑
let path = NSBundle.mainBundle().pathForResource("iOS04", ofType: "json")
如果返回值是可選類型的就需要解包
如果實在記不住解包,可以寫完根據(jù)提示來補全
let data:NSData = NSData (contentsOfFile: path!)!
do{
let rootArray = try NSJSONSerialization .JSONObjectWithData(data, options: .MutableContainers) as! [[String:String]]
print(rootArray)
}catch
{
//異常捕獲序列化出錯的時候就會自動來到這里
print("error")
}
最后需要注意的一點就是
swift里面盡量不要寫self一般只有在閉包內(nèi)部才會強制要求寫self
以上就是swift基礎(chǔ)部分的簡單總結(jié)