Swift相比OC語言有哪些優勢
一、自動作類型推斷swift
二、能夠保證類型使用安全數組
Swif類型說明符
——Swift增長了Tuple表示元組類型安全
——Swift增長了Optional表示可選類型閉包
常量一變量命名:
——能夠用任何你喜歡的字符做爲常量和變量名,包含Unicode 字符app
——常量與變量名不能包含數學符號,箭頭,保留的(或者非法的)Unicode 碼位,連線與製表符函數
——不能以數字開頭,可是能夠在常量與變量名的其餘地方包含數字指針
/*code
\n —— 換行對象
\t —— 水平製表符 (4個空格)繼承
\—— 表示1個
"—— 表示1個"
'——表示1個'
*/
3.5e2 == 3.5乘以10的二次方
3.5e-3 == 3.5乘以10的-3次方
C的函數定義
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的長度(本身定義字符串長度後會使用調用後的長度)
charsex[] ="nan";
NSLog(@"%c",sex[2]);
Swift
在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類型比較
只能使用 == 或者 != 不可使用 >、<、>=、<=
當倆個元組中的數據類型及順序徹底匹配時,可使用比較運算符比較
若是元組包含Bool類型,只能使用==和!=比較,不可使用>、<、>=、<=
Swift 標準庫只能比較七個之內元素的元組比較函數。若是你的元組元素超過七個時,你須要本身實現比較運算符。
空合運算符(只適用於可選類型)
形式:a ?? b
對可選類型 a 進行空判斷,若是 a 包含一個值就進行解封,不然就返回一個值 b
表達式 a 必須是 Optional 類型
默認值 b 的類型必需要和 a 儲存值的類型保持一致
區間運算符
一、閉區間
a...b定義一個包含從 a 到 b (包含 a 和 b )的全部值的區間
a 的值不能超過 b
二、半開區間
a ..< b 定義一個包含從 a 到 b(不包含b)的全部值的區間
a 的值不能超過 b
三、自增自減運算符在Swift中不能用
++a (前增) a++ (後增) --a (前減) a-- (後減)
//使用索引值
var name = "yangyingqiu" (後面會自定添加\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循環
for item in name {
print(item, terminator:"")
}
print()
//while循環
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
//若是在循環體中不須要循環變量的值,可使用下劃線代替變量的名稱
for _ in 1...power {
answer * = base
}
Switch語句中能夠加 int char string 枚舉 double(後面必須加default)若是想知足多個條件打印同一個結果能夠用「,」來隔開
var ch = 3
switch ch {
case 10:
print("不講價")
case 7...9:
print("(ch)折")
default :
print ("不可能")
} //能夠添加元組類型的數據
給循環添加 標籤
outer: for I in 1...3 {
inner:for j in 1...5{
break outer
}
print("I = (i),j = (j)")
}
//Swift中,Struct,Double,String、數組、字典、都是值類型
//swift中,類、函數、閉包都是引用類型
//若是結構體中的s已是常量,裏面的成員變量和結構體自己就不能夠從新賦值了
//若是類中的s是常量,裏面的成員變量能夠從新賦值變量,不能從新賦值常量
//、在swift中 == 號只能用在值類型不能用在引用類型(== 在自定義的結構體中自定義的類中也不能夠用)
//Swift中 === (恆等於) !==(恆不等於)只能用於引用類型,不能用於值類型,判斷倆個對象指向同一個內存空間(判斷地址)
//在結構體中,必須講方法聲明爲可變的,才能夠在方法體中改變屬性的值
//在類中能夠直接改變屬性的值
重寫set、get方法的時候方法裏面不能出現sum屬性本省不然出現死循環、
若是沒有加set、get就會默認重寫get語句,get中有倆個語句的話就必須添加get方法
lazy起到延遲加載做用,在調用的時候使用
//便利構造器(若是在某個構造器中調用其餘的構造器,需要將構造器作成便利構造器)
指定構造器與便利構造器的區別:
默認構造器是系統提供的構造器
指定構造器是類中主要的構造器,一個指定構造器將初始化類中所提供的全部屬性
便利構造器是類中次要的、輔助型的構造器,能夠定義便利構造器來調用同一個類中的指定構造器
//子類能夠繼承父類中全部的屬性和方法,子類能夠有本身獨有的屬性和方法
//子類能夠重寫父類中的方法
你能夠將一個繼承來的只讀屬性重寫爲一個讀寫屬性,只須要在重寫版本的屬性裏提供,getter 和setter 便可,可是,你能夠將一個繼承來的讀寫屬性重寫爲一個只讀屬性
循環強引用問題(retain cycle),在倆個類中互相包含對方的對象作成本身的屬性會發生循環強引用
解決:一、使用弱引用,用一個weak來修飾
二、unowned(不能使用引用類型,只能使用基本類型)
thows:通常用於方法定義的按返回值以前,表好似將該方法作成一個可拋出錯誤的方法(throwing)
Thow:通常用於方法體內,拋出某個具體的錯誤,若是能執行throw,後續語句都不會執行,該方法調用當即結束,等效return語句
Ios 多態
不一樣類中有相同方法,調用的時候互不影響
父類指針指向子類,調用一個被重寫的方法,父類指針調用這個方法呈現的都是子類中方法的定義執行
擴展
//var name:String = ""(在擴展中不能夠擴展存儲屬性)
//能夠擴展「計算屬性」
//能夠擴展「只讀屬性」
//存儲類型的類屬性
//計算類型的類屬性
//只讀類型的類屬性
//添加對象方法
//添加類方法
//在擴展中只能爲類添加便利構造器,不能夠添加指定構造器