Swift相比OC語言有哪些優(yōu)點
1、自動做類型推斷
2、可以保證類型使用安全
Swif類型說明符
——Swift增加了Tuple表示元組類型
——Swift增加了Optional表示可選類型
常量一變量命名:
——可以用任何你喜歡的字符作為常量和變量名,包含Unicode 字符
——常量與變量名不能包含數(shù)學符號,箭頭,保留的(或者非法的)Unicode 碼位,連線與制表符
——不能以數(shù)字開頭,但是可以在常量與變量名的其他地方包含數(shù)字
\n —— 換行
\t —— 水平制表符 (4個空格)
\\—— 表示1個\
\"—— 表示1個"
\'——表示1個'
3.5e2 == 3.5乘以10的二次方
3.5e-3 == 3.5乘以10的-3次方
C的函數(shù)定義
?????????charname[10] ="China";
? ? ? ? char address[10] = {'C','h','i','n','a','\0','B','e','i','\0'};
? ? ? ? NSLog(@"%ld",strlen(name));//里面字符串的長度
? ? ? ? NSLog(@"%ld",sizeof(address));
????????//包含\0的長度(自己定義字符串長度后會使用調(diào)用后的長度)
?????????charsex[] ="nan";
? ? ? ? NSLog(@"%c",sex[2]);
在Swift中要想越界
num = num &+ 1(溢出運算)
var str1 = "China"
var str2 = str1 + "Beijing"
str1 += "Beijing"?
9 % 4 ?// ?等于1
9 % -4 ?// ?等于1
-9 % 4 ?// ?等于-1
-9 % -4 ?// ?等于-1
BOOL類型比較
只能使用 == 或者 != ? 不可以使用 ?>、<、>=、<=
當倆個元組中的數(shù)據(jù)類型及順序完全匹配時,可以使用比較運算符比較
如果元組包含Bool類型,只能使用==和!=比較,不可以使用>、<、>=、<=
Swift 標準庫只能比較七個以內(nèi)元素的元組比較函數(shù)。如果你的元組元素超過七個時,你需要自己實現(xiàn)比較運算符。
空合運算符(只適用于可選類型)
形式:a ?? b
對可選類型 a 進行空判斷,如果 a 包含一個值就進行解封,否則就返回一個值 b
表達式 a 必須是 Optional 類型
默認值 b 的類型必須要和 a 儲存值的類型保持一致
//區(qū)間運算符
1、閉區(qū)間
????a...b定義一個包含從 a 到 b (包含 a 和 b )的所有值的區(qū)間
????a 的值不能超過 b
2、半開區(qū)間
? ? a ..< b 定義一個包含從 a 到 b(不包含b)的所有值的區(qū)間
? ? a 的值不能超過 b
3、自增自減運算符在Swift中不能用
? ? ++a (前增)???????? a++ (后增)????????--a (前減) a-- (后減)
//使用索引值
var name = "qiuruobai" ? ? ? ?(后面會自定添加\0)
var index = name.startIndex //得到字符“Y”的索引值
index ?= name.endIndex ?//得到最后位置的索引值,比最后一個字符“g”的位置打1
index = name.index(after: name.startIndex) //獲取起始位置之后的索引值
index = name.index(before: name.endIndex) ?//獲取最后位置之前的索引值
index = name.index(name.startIndex, offsetBy:3) //
index = name.index(name.endIndex, offsetBy:-4) //
print(name[index])
遍歷字符串中的每個字符
//for in循環(huán)
for item in name {
? ? print(item, terminator:"")
}
print()
//while循環(huán)
var offset = 0
while offset < name.count {
????let index = name.index(name.startIndex, offsetBy: offset)
????//(let index:String.Index = name.index(name.startIndex, offsetBy: offset))
????print(name[index])
????offset += 1
}
//遍歷字符串的所有索引值,從而遍歷每個字符
for myIndex in name.indices {
????print(name[myIndex])
}
可選綁定語法
if let item = a {
????print{item}
}
//遍歷語法
for var item in1...5 ? { ? ? ?//如果不加var默認為let
????print{item}
}
let base = 3
let power = 10
var answer = 1
//如果在循環(huán)體中不需要循環(huán)變量的值,可以使用下劃線代替變量的名稱
for _ in 1...power {
answer * = base
}
Switch語句中可以加 int char string 枚舉 double(后面必須加default)如果想滿足多個條件打印同一個結(jié)果可以用“,”來隔開
var ch = 3
switch ch {
case 10:
print("不講價")
case 7...9:
print("\(ch)折")
default :
print ("不可能")
} //可以添加元組類型的數(shù)據(jù)
給循環(huán)添加 標簽
outer: for I in 1...3 {
????inner:for j in 1...5{
????????break outer
????}
print("I = \(i),j = \(j)")
}
//Swift中,Struct,Double,String、數(shù)組、字典、都是值類型
//swift中,類、函數(shù)、閉包都是引用類型
//如果結(jié)構(gòu)體中的s已經(jīng)是常量,里面的成員變量和結(jié)構(gòu)體本身就不可以重新賦值了
//如果類中的s是常量,里面的成員變量可以重新賦值變量,不能重新賦值常量
//、在swift中 == 號只能用在值類型不能用在引用類型(== 在自定義的結(jié)構(gòu)體中自定義的類中也不可以用)
//Swift中 === (恒等于) ?!==(恒不等于)只能用于引用類型,不能用于值類型,判斷倆個對象指向同一個內(nèi)存空間(判斷地址)
//在結(jié)構(gòu)體中,必須講方法聲明為可變的,才可以在方法體中改變屬性的值
//在類中可以直接改變屬性的值
重寫set、get方法的時候方法里面不能出現(xiàn)sum屬性本省否則出現(xiàn)死循環(huán)、
如果沒有加set、get就會默認重寫get語句,get中有倆個語句的話就必須添加get方法
lazy起到延遲加載作用,在調(diào)用的時候使用
//便利構(gòu)造器(如果在某個構(gòu)造器中調(diào)用其他的構(gòu)造器,須要將構(gòu)造器做成便利構(gòu)造器)
指定構(gòu)造器與便利構(gòu)造器的區(qū)別:
默認構(gòu)造器是系統(tǒng)提供的構(gòu)造器
指定構(gòu)造器是類中主要的構(gòu)造器,一個指定構(gòu)造器將初始化類中所提供的所有屬性
便利構(gòu)造器是類中次要的、輔助型的構(gòu)造器,可以定義便利構(gòu)造器來調(diào)用同一個類中的指定構(gòu)造器
//子類可以繼承父類中所有的屬性和方法,子類可以有自己獨有的屬性和方法
//子類可以重寫父類中的方法
你可以將一個繼承來的只讀屬性重寫為一個讀寫屬性,只需要在重寫版本的屬性里提供,getter 和setter 即可,但是,你可以將一個繼承來的讀寫屬性重寫為一個只讀屬性
循環(huán)強引用問題(retain cycle),在倆個類中互相包含對方的對象做成自己的屬性會發(fā)生循環(huán)強引用
解決:1、使用弱引用,用一個weak來修飾
2、unowned(不能使用引用類型,只能使用基本類型)
thows:一般用于方法定義的按返回值之前,表好似將該方法做成一個可拋出錯誤的方法(throwing)
Thow:一般用于方法體內(nèi),拋出某個具體的錯誤,如果能執(zhí)行throw,后續(xù)語句都不會執(zhí)行,該方法調(diào)用立即結(jié)束,等效return語句
Ios ?多態(tài)
不同類中有相同方法,調(diào)用的時候互不影響
父類指針指向子類,調(diào)用一個被重寫的方法,父類指針調(diào)用這個方法呈現(xiàn)的都是子類中方法的定義執(zhí)行
擴展
//var name:String = ""(在擴展中不可以擴展存儲屬性)
//可以擴展“計算屬性”
//可以擴展“只讀屬性”
//存儲類型的類屬性
//計算類型的類屬性
//只讀類型的類屬性
//添加對象方法
//添加類方法
//在擴展中只能為類添加便利構(gòu)造器,不可以添加指定構(gòu)造器
oc 的成員變量修飾符
<1>@private : 私有的,只能在類內(nèi)部訪問,在類的子類或類的外部類中都訪問不到!
<2>@protected : 受保護的,可以在類和子類中訪問,在類的外部不可以訪問(默認修飾符)
<3>@package : 包保護的,可以讓相同包中其他類訪問,但是不可以被不同包中的類訪問?
Swift 屬性的訪問修飾符
(1)private:可用于屬性和方法,只能被本類內(nèi)部訪問,子類或外部類都不可以訪問
(2)filePrivate:文件私有,在文件中任何地方都可以訪問,在其他文件中不可以訪問,等效于OC中的@protected
(3)internal:內(nèi)部訪問,可以讓相同包中的任意類訪問,其他包中的類不可以訪問 (默認修飾符)
(4)public、open:公開的,可以在任何類中訪問,但是open只能在類中使用,不可以用于結(jié)構(gòu)體和枚舉等
注:僅為個人總結(jié),如有理解錯誤歡迎大家糾正????