標籤:http 使用 資料 io 問題 cti
前幾天剛剛將有關oc的教程草草的看了一遍,發現oc其實也不像傳說的那麼難。今天又開始馬不停蹄的學習Swift因為我很好奇,到底蘋果出的而且想要代替oc的程式設計語言應該是個什麼樣子呢?看了網上的一些中文教材之後,才發現原來swift真的是太靈活,相比較之前oc語言真的是有天壤之別了。隨著學習的深入,我發現自己真的喜歡上了swift,鑒於網上的教程還不是太多的緣故,我就萌生了將自己的一些學習體驗寫成一系列部落格的想法,如果有什麼不全面的地方歡迎大家來拍磚。
首先我來說說自己對於swift的第一印象吧!那就太靈活了,比如你要定義一個變數aa或者常量bb的時候,在c#裡面你就需要首Crowdsourced Security Testing道aa/bb到底是什麼類型,假如是整形的話,你會寫成int aa=0;注意每條語句的後面你還需要加上一個分號,這在很多語言裡面都有這個要求吧!誒,但是在swift裡面你就不需要這麼的麻煩了,對於變數你直接使用var關鍵字,對於常量你直接使用let關鍵字,並且在定義之前你也不需要知道該變數到底是什麼類型,你所要做的就是給它賦個初始值就可以了,像var aa="cai"(當然語言後面可以加,也可以不加分號),swift就可以自己推斷出當前這個aa變數是String類型的。是不是很智能呢?是不是有點指令碼語言的感覺呢?是不是很像動態語言呢?別急它還有更多的驚喜呢?且看下面的這段代碼:
var test="hello world";
var number=10;
var result=test+String(number);
var result2="hello world\(number)"
我現在如果問你result和result2會不會產生一樣的結構呢?為什麼呢?答案是它們的結構是一樣的,這就是swift裡面的有一個新的特性:\()可以直接將一個常量或者變數放在字串裡面輸出。這隻是swift新特性裡面的冰山一角呢?別急,且聽我慢慢道來,讓我們試想這樣一個問題:在其他語言裡面如果要定義一個字典類型的話,你會怎麼做呢?在c#裡面的解決方案就是:
Dictionary<string,string> testDic=New Dictionary<string,string>();
testDic.Add("key",value);
我們首先需要去建立一個字典執行個體,然後再一個一個的往裡面添加key和value。那麼這個問題如果放在swift裡面會怎麼做呢?
var testDic=["key1":value1,"key2":value2]; (這條語句定義之後swift就推斷出當前的testDic是一個欄位的變數)
是的,就是這樣的簡單明了。key和value之間利用“:”分割開來,然後不同的索引值對之間通過“,”分割開來,這個時候你可能會問如果我想要某個鍵裡面的value,我應該怎樣做呢?也是很簡單的:
var keyValue1=testDic["key1"];
只要通過對應的key取出value就可以了,如果我想要在前面定義的testDic字典變數裡面在增加一個索引值對應該怎麼做呢?如下:
testDic["keys"]="value3";
好了,說到這裡面你可能已經忍不住想要自己試一試了,別急,讓我們再來提出一個問題:如果你想要定義一個空的數組,或者空的字典類型,你會怎麼做呢?想想你自己熟悉的語言吧!但是在swift裡面卻只要:
var testArray=[]; //定義一個空的數組
var testDictionary=[:]; //定義一個空的字典類型
你會疑問這樣就可以了嗎?是的,這樣就足夠了,剩下的就留給swift自己去推斷吧!
好了,經過這個幾個小問題,你可能會覺得swift確實挺強大,但是再強大也是從基礎開始的,下面就讓我們從頭來看一看swift裡面的一些基礎部分吧!
首先是變數/常量的定義,想想你自己熟悉的語言,你會怎麼做呢?在Swift裡面,你只需要如下:
var testBL=10; //定義一個變數
let testCL="hello world"; //定義一個常量
var testBL1=10.0,testBL2=10,testBL3="xiaocai"; //同時定義多個變數也是可以的,就像其他語言一樣快捷
如果你能夠知道所要定義的變數或者常量的初始值的話,那麼就盡量給它們初始值吧!這樣你就不需要過多的考慮當前變數或者常量的類型,直接賦好初始值讓swift自己去推斷吧!但是有的時候你暫時還不知道自己所要定義的變數的初始值到底是什嗎?這個時候你應該怎麼去定義呢?如下:
var testWithOutValue:Int;
let testWithOutValue2:String;
這種情況下,你需要在定義的變數名稱後面加上“:”,然後是變數類型(Int,String),說到這裡讓我們順便提一下swift裡面一些常用類型吧!包括如下:
Int,String,Bool,Array,Dictionary,Double,Float,nil(這個在oc裡面表示一個null 指標,但是swift裡面就是空類型,僅此而已)
在swift裡面還特地提供了兩個屬性用來或者每種類型的取值範圍呢,分別是:min,max,有的時候我們可能需要進行類型強轉,這個時候在swift裡面應該怎麼處理呢?如下:
var testInt=10;
var testString="xiao";
var testResult=testString+String(testInt);
沒有就是在所要轉換的類型前面用括弧括起來加上強轉的目的類型就可以了。這裡面提一點有趣的事情:
var testBigNumber=1_000_000_000_000;
這種在中間加上下滑線的大整形,swift能夠識別嗎?答案是yes,這就方便我們處理一些大資料了。我記得在c#裡面有個類型別名的做法,那麼在swift裡面我們應該怎麼做呢?
var myInt=Int; //這樣就相當於給Int類型去了一個別名了,後面如果你想要定義自己的整形就可以使用myInt了。
println(myInt.min);
var testMyInt:myInt; //定義一個Int類型
好了,讓我們再將一個swift裡面一個很牛逼的類型元組(tuples),首次看到的話,你可能會問這是什麼東東呢?讓我們來假設這樣一種情境吧!在你開啟瀏覽器的時候,因為網路原因,你可能在訪問網頁的時候看到了404。如果我說光是一個404我可能不知道到底是什麼意思,我要你在程式裡面將不同code利用解說文字一一對應起來,這個時候你會怎麼做呢?在c#裡面你最可能想到的辦法就是定義一個字典對象keyValue的形式。那麼在swift裡面我們應該怎麼做呢?其實跟字典差不多,但是定義,訪問的方式就有很大的差別了。
var http404Tip=[404,"Not Found"]; //定義一個說明元組
http404Tip.0; //訪問元組裡面第一個元素
http404Tip.1; //訪問元組裡面第二個元素
var (statusCode,statusVlaue)=http404Tip;
println(statusCode+statusValue); //直接利用值綁定的方式訪問
如果我只對code感興趣的話,我可以這樣做:
var (statusCode,_)=http404Tip; //底線就相當於一個預留位置的意思
println(statusCode);
在swift裡面我看到一些c#的影子,為什麼這麼說呢?請看下面的例子:
var testOption:Int?=10;
println(testOption!);
這兩行代碼是在幹什麼呢?首先第一行代碼是在定義一個可選的Int類型,就跟c#裡面的可空類型一樣。然後第二行代碼又是在幹什麼呢?後面為什麼會有個!號呢?這就是在說到底testOption會不會為nil呢?你給我去解析一下,強制swift做解析。但是這樣做其實是很危險的,因為當解析為空白的時候,會出現異常。那麼遇到這種情況的話,我們應該怎樣去處理呢?我們可以利用swift裡面提供的可選綁定的方式,如下:
if var testOptionResult=testOption{
println("parse success");
}
else{
println("parse failed");
}
如果強制解析成功的花,進入if裡面,如果解析的過程發現是nil進入else,這樣就可以很好的處理上面的異常問題了。在swift裡面還有個隱式解析的過程,如下:
var testYS:String!="xiao cai";
println(testYS);
我們在定義變數的時候,就聲明了一個帶驚嘆號的String類型,輸出的時候我們就不需要強制解析了。
好了,讓我們在來說一下本篇部落格的最後一個知識點,那就是斷言。在swift裡面定義一個斷言如下:
var age=-3;
assert(age>0,"Big Zero");
只有當age>0為true的時候,程式才繼續執行,否則進入斷言裡面輸出“Big Zero”提示資訊。