相信很多新手開始學習Swift的時候都會有點無所適從,下面總結了一些初學者需要了解和注意的地方供大家參考和學習.
一.與OC的差別
1.程序入口:AppDelegate里面的UIApplicationMain
2.創建一個類只創建一個文件以.swift結尾
3.OC以@interface開始@end結束Swift以大括號{}開始和結束
4.OC一行代碼以;結束swift以換行結尾沒有分號(但加分號之后也不報錯)
二.創建對象
1..OC創建視圖(對象)用alloc init ? swift采用()來創建對象
2.OC采用initWithxxx ? swift采用(xxx:)
3.修改背景顏色[UIcolor redColor]? swift里面UIcolor.redColor
4.=左右兩邊都要有空格
5.Oc添加視圖self.view addsubview? swift里可以不寫self但寫了也不報錯(有一個地方進行比較----閉包)
6.Oc里枚舉是全的swift中采用類型.樣式的形式
7.Oc打印NSlog? swift中得枚舉可以直接省略前面的類型(注意:省略類型后,后面的提示有時候不好)? print執行效率比Nslog高
8.打印print(已經可以直接換行,從網上搜得好多資料說println才能換行,print不能,應該是之前的版本,swift2.0已經修改了)
同時注意print的使用:print("\(變量)")
三.swift語法
1.let定義常量賦值之后不能改變
2.var定義變量
注意:
1>swift里的自動推導:變量/常量依據等號右邊的值自動推導出變量/常量的類型
2>查看類型optional + click
3>不同類型之間不能直接運算(ocint+ folat有隱式轉換,會將低精度的int自動轉為float ?但是,swift只有強制轉換)
強制轉換兩種方式:1.不采用自動推導--->在變量名后面指定類型let a:Double =10
2.采用 類型(變量名)實現強制轉換
letnumber =10
letnum =Double(number)
print(num)//10.0
建議優先定義let,如果有需要,再改成var
四.可選項
1.可選項有可能有值,也有可能沒有值
2.可選項不能直接運算若要直接運算的話,需要強制解包
3.可選項是swift特有的.
4.什么是可選項?在變量/常量后面加一個?就是一個可選項.
leta :Int? =10(常量的可選項必須賦值,否則后面打印也會報錯)
ler.swift:21:15: Constant 'a' used before being initialized--->初始化之前就使用了
5.可選項的默認值為nil
6.強制解包在可選項后面加!就是強制解包(注意!前面沒有空格)
7.強制解包存在一定的風險
8.報錯
unexpectedly found nil while unwrapping an Optional value
強行解包的變量沒有值,就會報此錯誤,因此一定要考慮清楚是否能夠直接進行強制解包
9.蘋果為我們提供了一種新的方式: ??
??會判斷你前面的可選項是否為nil若為nil則取??后面的值若不為nil則對??前面的可選項進行解包操作
示例:
//可選項變量值為nil,??取后面的值
varnumber :Int?
letresult = (number ??0) +5
print(result)//打印結果為5
//可選項變量的值不為nil,取??前可選項解包后的值
varnumber1 :Int? =10
letresult1 = (number1 ??0) +5
print(result1)//打印結果為15
五.if語句
command+波浪線切換工程
Oc里面有非零即真概念
1.swift沒有非零即真的概念
2.if后面的()可以省略
3.但是{}不可以省略
4.三目運算符a?(b):(c)三目運算符在oc和swift里面一樣
示例:
//1.if
leta =10
ifa >=10{
print("\(a)")
}elseifa <19{
print("111")
}
//2.三目運算
letb =10
letc =20
letd = b > c ? b : c
print("\(d)")
六.if let語法
1.用于判斷可選項
iflet新的變量名=可選項{
新變量名的作用域:新變量名不是可選項
}
若新變量名有值(對可選項進行的一個解包),則運行if后面{}的值;
若新變量名沒有值則不執行
多個變量判斷,用逗號隔開.
2.iflet后面可以加where條件判斷語句,用于判斷新變量名是否符合要求;注意where后面沒有智能提示
多個變量用,分開進行判斷
示例:
leturlStr ="www.baidu.com"
leturl =NSURL(string: urlStr)
//if let語句,若新變量不為nil,則執行{}
ifletoUrl = url{
letrequest =NSURLRequest(URL: oUrl)
print(request)
}
七.guard let
1.guard let與iflet相反
guard let新變量名=可選項else{
return
}
新變量名的作用域
若新變量有值則不運行else后面{}里的代碼
若新變量名沒有值,(可選項為nil)則運行else后面{}的代碼
多個變量可以用,隔開,只有兩個變量都有值才走后面的代碼
示例:
leturlStr ="www.baidu.com"
leturl =NSURL(string: urlStr)
//guard let語句,若新變量為nil,則執行{},不為nil則執行{}后面的語句
guardletoUrl = urlelse{
return
}
letrequest =NSURLRequest(URL: oUrl)
print(request)
八.switch
oc中只能為常量
1.swift不僅局限于整型,字符串等其他類型
2.case后面可以不加break但是必須要有一條可執行的語句
3.當switch把所有的情況到考慮到的時候(例如:枚舉的類型),可以省略default(沒考慮到必須加)
示例一:
//switch語句
letscore =89
switchscore/10{
case6:
break
case7:
print("及格")
case8:
print("良好")
case9:
break
default:
break
}
示例二:
//定義一個枚舉的類型
enumScoreType:String{
caseTypeGood ="優"
caseTypeMiddle ="良好"
}
//定義一個變量
lettype :ScoreType= .TypeGood
//用switch(里面的case為枚舉的兩種類型,因為考慮到了全部的兩種情況,所以可以不寫default)
switchtype{
case.TypeGood:
print("優")
case.TypeMiddle:
print("良好")
}
九.for循環
1.for iint0...10{
print(i)//打印0到10共11個
}
2.for iint0..<10{
print(i)//打印0到9共10個
}
系統檢測到let a沒有被使用建議改為_這個_可以理解為忽略
十.字符串string類型
1.NSSring繼承自NSObject的對象swift中String是結構體(運行效率高一點)
2.可以相互轉換
一個中文占3個字節
3.字符串拼接
1> +(加號)拼接
2>print("\(str)便是晴天")"\(變量名)拼接的內容"
4.格式化字符串string(format:...)
示例:
//格式化字符串
leth =05
letm =06
lets =07
letstr1 =String(format:"%02d:%02d:%02d", arguments: [h,m,s])
print(str1)//打印結果:05:06:07
5.截取字符串:swift的截取字符串使用起來并沒有OC的靈活和方便,所以可以將String轉化為NSString來進行字符串的截取
示例:
//截取字符串swift風格的
//str = "你若安好,便是晴天"
letstartIndex = str.startIndex
letendIndex ="123".endIndex//此處的123為占位符(即換為任意的字符都可以,只是用來計算長度的)
letsubStr = str.substringWithRange(startIndex..
print(subStr)//打印結果:你若安
//截取字符串OC風格的
letsubStr1 = (strasNSString).substringWithRange(NSMakeRange(0,5))
print(subStr1)//打印結果:你若安好,
十一.集合:數組字典
一)數組用[]存放
2.let定義數組不可變var定義的數組可變
3.只能添加相同數據類型
4.若要添加不同類型強制指定為NSObject(oc的)也可以AnyObject(協議)[swift的]
ps:NSObject的父類也是一個協議
5.數組初始化[類型]()
6.合并數組+
注意:只能對相同類型的數組才能合并.
7.刪除數據
1>removeAll ? ------>刪除后內存沒有了
2>removeAll(keepCapacity:true)-->刪除后內存還在
3>removeFirst/AtIndex刪除第一個/指定元素
4>let value result[3]獲取指定索引的數據
示例:
//數組
//新建一個數組并指定其元素的類型
vararray = [1,2,3,4,5]
//追加元素
array.append(6)
//打印結果
print(array)//打印結果[1, 2, 3, 4, 5, 6]
//新建一個數組并指定其元素的類型
vartemp: [AnyObject] = [AnyObject]()
//追加元素
temp.append("你若安好")
vartemp1:[AnyObject] = [AnyObject]()
temp1.append("便是晴天")
temp1.append(0)
//數組的合并相同類型的數組可以直接用+來實現
varresult = temp + temp1
print(result)//打印結果:[你若安好,便是晴天]
//不同類型的數組可以遍歷其中一個來實現
forvalueinarray {
result.append(value)
}
print(result)//打印結果:[你若安好,便是晴天, 1, 2, 3, 4, 5, 6]
//刪除數組的元素
result.removeFirst()
print(result)//打印結果:[便是晴天, 1, 2, 3, 4, 5, 6]
//刪除全部元素
//對于打印結果的說明:在64之前,打印的是8的指數,例如有3個元素,打印8;有10個元素,打印16,但超過之后就沒有規律了
print(result.capacity)//打印結果8
//數組名.removeAll(keepCapacity: true),
//此處為true,則刪除所有的數據之后,內存還保留
//此處為false,則刪除所有的數據之后,內存不再進行保留
result.removeAll(keepCapacity:true)
print(result.capacity)//打印結果:8
result.removeAll()
print(result.capacity)//打印結果:0
二)字典
1.鍵值對["key": value](key一般是string value不一定)
2.可變字典var ;不可變字典let
3.添加數據字典名["name"] ="it"
4.若key值不存在直接添加數據;若key已經存在,則賦值會替換原來的值.
5.若想刪除字典的某一個key值,直接給key的值賦為nil就可以了.
6.若指定了字典的值的類型,必須是相同的類型才能賦值.想給字典添加其他的數據類型,需要在初始化的時候指定value的值的類型為AnyObject
7.對字典進行遍歷fordicinnewDict{
print(dic)
}
8.字典的合并
把dict合并到newDict-->遍歷dict,將其元素添加到newDict
示例:
//新建一個字典["key":value]
vardict = ["key":"value"]
//給字典賦值,若key不存在,則直接添加
dict["name"] ="果而"
print(dict)//打印結果:["key": "value", "name": "果而"]
//給字典賦值,若key存在,則會覆蓋原來的值
dict["name"] ="貝爾"
print(dict)//打印結果:["key": "value", "name": "貝爾"]
//若想要刪除字典的元素,則將key對應的value設置為nil即可
dict["name"] =nil
print(dict)//打印結果:["key": "value"]
//若要給字典添加不同類型的元素,需要將字典設置類型
varnewDict:[String:AnyObject] = [String:AnyObject]()
newDict["name"] ="史努比"
newDict["age"] =2
print(newDict)//打印結果:["age": 2, "name":史努比]
//字典的合并,遍歷一個字典,將其元素添加到另一個字典中
//字典的遍歷(注意key和value只是一個占位符)
for(key,value)indict{
print("字典的key為:\(key),value為:\(value)")
}
//字典的合并
for(key,value)indict{
newDict[key] = value
}
print(newDict)//打印結果為:["age": 2, "key": value, "name":史努比]
十二.函數
1.函數的格式: func函數名(參數名1:參數類型,...) ->返回值類型{函數的代碼}
2.函數的參數說明
3.函數的返回值
大部分函數返回值為空swift有3種返回值為空的形式
示例:
//函數
//第一個參數只是一個標記,在給函數參數的時候的提示
funcsum(第一個參數num1:Int, num2:Int) ->Int{
returnnum1 + num2
}
//函數返回值為空的三種寫法
funcdemo1(){
print("返回值為空")
}
funcdemo2() ->(){
print("返回值為空")
}
funcdemo3() ->Void{
print("返回值為空")
}
?