Swift超基礎(chǔ)語法(基礎(chǔ)篇)

常量

定義常量的方法

  • 我們先看一下最完整的定義常量的書寫格式:
    let 常量名稱 : 常量類型 = 初始化值;
    例:
    let name : String = "lyu";
    let age : Int32 = 18;
    ...
  • Swift中的類型推導(dǎo)(不是推倒,別激動):
    如果在定義變量(或常量)的同時進(jìn)行賦值(即完全初始化),那么變量(或常量)的類型可以省略,并且Swift會根據(jù)我們的賦值推導(dǎo)出變量(或常量)的類型,如下:
let n = 10 //實(shí)際上,現(xiàn)在這個n已經(jīng)有了明確的類型int
  • 定義常量的快捷方法:
    Swift中如果一行中只有一句代碼的時候允許省略末尾的分號;,再加上Swift的類型推導(dǎo)讓我們定義常量變得更加便捷,如下
    let 常量名稱 = 初始化值;
    例:
    let name  = "lyu"
    let age = 18
拓展:
Swift是一個強(qiáng)類型的語言,它的任何一個標(biāo)識符都必須有明確的類型,如果一個變量(或常量)沒有明確的數(shù)據(jù)類型則編譯報(bào)錯,如下:
錯誤寫法:
let height //系統(tǒng)無法推導(dǎo)height的數(shù)據(jù)類型
正確寫法:
let height : Int32 

變量

定義變量的方法

  • 依舊先看一下最完整的定義常量的書寫格式:
var 變量名稱 : 變量類型 = 初始化值;
例:
var name : String = "lyu";
var age : Int32 = 18;
...
  • 定義變量的快捷方法:
    原理與定義常量相同,如下:
var 變量名稱 = 初始化值
例:
var name = "lyu"
var age = 18
...
  • tips:
    • 建議初學(xué)者優(yōu)先使用常量進(jìn)行定義,當(dāng)明確某一個常量需要修改的時候,在將其定義為變量
    • 常量的本質(zhì)是指向的內(nèi)存地址不可以修改,但是當(dāng)我們通過內(nèi)存地址拿到一個實(shí)例化對象的時候,是可以通過內(nèi)存地址來修改對象的內(nèi)部屬性的,例如:
let view : UIView = UIView(); //實(shí)例化對象
view.frame = CGRectMake(100, 100, 100, 100); //雖然view是一個常量,但是我們?nèi)匀豢梢孕薷乃赶虻膶ο蟮膶傩?錯誤寫法如下:
view = UIView(); //無法使view指向一個新的對象

對象

實(shí)例化對象的方法

什么?實(shí)例化對象要先寫new?要alloc+init?你out了,Swift中實(shí)例化對象非常之簡單,我們簡單看兩個例子:

例1 view:
//下面簡單介紹三種創(chuàng)建UIView的方法
let view : UIView = UIView() //相當(dāng)于java中的new
let view : UIView = UIView.init(frame : CGRectMake(1,1,1,1)) //相當(dāng)于OC中的initWithFrame
let view : UIView = UIView(frame : CGRectMake(1,1,1,1)) //相當(dāng)于OC中的initWithFrame
//修改屬性
view.alpha = 0.8 
view.backgroundColor = UIColor.redColor() //隨意修改一些屬性值,但是Swift中取消了smallTalk機(jī)制,一并換成了.點(diǎn)語法
//實(shí)例化UIButton對象的方法,對比其Swift中枚舉值的兩種寫法
let button : UIButton = UIButton(type: UIButtonType.Custom) //枚舉值寫法的改變(枚舉類型.具體類型)
let button : UIButton = UIButton(type : .Custom) //枚舉值的簡便寫法
//修改button的屬性
button.setTitle("按鈕",forStatus: .Normal) 
//將button添加到父控件
view.addSubview(button) //添加控件
例2 controller:
let VC : UIViewController = UIViewController()
let navigationController : UINavigationController = UINavigationController(rootViewController:VC) //初始化rootViewController

實(shí)例化對象的方法大致如此

Swift的基本數(shù)據(jù)類型

這里大致介紹一下整型,以后有機(jī)會再補(bǔ)充吧...

Int8   : 有符號8位整型(相當(dāng)于C語言中的char)
Int16 : 有符號16為整型(相當(dāng)于C中的short)
Int32 : 有符號32為整型(相當(dāng)于C中的int)
Int64 : 有符號64為整型(相當(dāng)于C中的long)
Int     : 默認(rèn),與平臺相關(guān)(例如:OC中的NSInteger)
UInt8   : 無符號8位整型(相當(dāng)于C語言中的unsigned char)
UInt16 : 無符號16為整型(相當(dāng)于C中的unsigned short)
UInt32 : 無符號32為整型(相當(dāng)于C中的unsigned int)
UInt64 : 無符號64為整型(相當(dāng)于C中的unsigned long)
UInt     : 默認(rèn),與平臺相關(guān)(例如:OC中的unsigned NSUInteger)

基本運(yùn)算

  • Swift中的數(shù)據(jù)類型沒有隱式類型轉(zhuǎn)換(*隱式類型轉(zhuǎn)換是指在C/OC等語法中,int類型與double類型進(jìn)行運(yùn)算時,系統(tǒng)自動將int類型提升至double類型,再進(jìn)行運(yùn)算)
錯誤寫法:
let a = 32
let b = 1.0
let sum = a + b  //編譯報(bào)錯
  • Swift中的類型轉(zhuǎn)換:
數(shù)據(jù)類型(變量名)
如,上面反例的正確寫法如下:
let a = 32
let b = 1.0
let sum = a + Int(b) //結(jié)果為33,整型
錯誤寫法:
let sum = a + (Int)b //Swift與OC剛好相反,小括號要將變量括起來,而不是標(biāo)識符

if邏輯分支

  • Swift中if語法的注意點(diǎn)
    • if后面的()可以寫也可以不寫,但是為了簡潔開發(fā),通常都不寫
    • if的判斷語句沒有非0(非空)即真,也就是說if后面的判斷語句必須有明確的真假
    • Swift中有明確的真假類型Bool,取值為ture或false,與java相同
    • if后面的{}必須寫,與C或OC不同
例:
正確寫法:
let age = 18
if age < 18{  //就算大括號中只有一句話,也不可以省略大括號
    print("未成年")
}
else{
    print("成年")
}
錯誤寫法:
if age{} 
if 1{}
//if后面必須有明確的真與假,所以上面做死循環(huán)的方法不可取,死循環(huán)正確的姿勢如下:
if age == 18{}

guard邏輯分支

Swift中的新型條件判斷語句guard(守衛(wèi),名字屌爆有木有),旨在提高代碼的可讀性,取代if的多層判斷,基本用法如下:

guard 條件語句 else{
結(jié)束語句  //break(switch或循環(huán)中使用)/continue(循環(huán)中使用)/return(函數(shù)中使用)
}
  • 語法解釋:
    • 條件成立,則跳過else繼續(xù)執(zhí)行
    • 條件不成立,進(jìn)入else執(zhí)行代碼,而else必須包含結(jié)束語句,用于跳出當(dāng)前的循環(huán)或函數(shù),這是為了保證后面的代碼不執(zhí)行
func ageIf(age : Int , sex : Int){
    guard age < 18 else{
        return
    }
    guard sex == 1 else{
        return
    }
    print("做我女朋友")
}
let age = 16
let sex = 1
ageIf(age, sex: sex)

keyMessage:guard多用在自定義函數(shù)或循環(huán)中

switch邏輯分支

重頭戲來了,Swift中的Switch不再那么雞肋,反而變得很強(qiáng)大,這點(diǎn)要與C和OC中區(qū)分開

  • Swift中Switch的基本用法:
    • switch后面的()可以寫也可以不寫
    • case結(jié)束后可以不加break,不會穿透
    • 如果想要執(zhí)行穿透效果,需要在case結(jié)束后添加一條語句:fallThrough
    • case后面可以判斷多個條件,多個條件需要以,分隔
例:
let sex = 1  //1:代表男 2:代表女
switch sex {
case : 0 , 1
print("正常人")
default:
print("不正常人")
}
  • 還沒完呢
    • switch可以判斷浮點(diǎn)型數(shù)據(jù),字符串類型數(shù)據(jù)
switch option {
case "+":
    result = a + b
case "-":
    result = a - b
case "*":
    result = a * b
case "/":
    result = a / b
default:
    print("錯誤")
}
  • switch可以判斷區(qū)間
Swift中支持的兩種區(qū)間:
半開半閉區(qū)間:1..<10 表示數(shù)學(xué)中的:[1,9)
閉區(qū)間:1...10 表示 [1,10]
let age = 18
switch age{
case 0..<18:
    print("未成年")
case 18...30:
    print("青年")
default:
    print("老年")
}

for循環(huán)

  • for循環(huán)的幾種寫法如下:
    • for后面的小括號可以省略
for var i = 0;i < 10;i++{  //一般用于從后往前遍歷,過期方法,不建議使用
    print(i)
}
  • 區(qū)間循環(huán)(做不到倒序遍歷):
for i in 0..<10{  //此時的i被推導(dǎo)為int類型
    print(i)
}
  • 如果不需要i,可以使用下劃線來替代
for _ in 0..<10{
    print("hello")
}

while循環(huán)與"新版doWhile"循環(huán)(repeatWhile)

while循環(huán)

  • 依舊可以省略while后面的()
  • 依舊沒有非0即真和非空即真
錯誤寫法:
while(1){}//報(bào)錯
死循環(huán)的正確姿勢:
while(1!=0){}

repeatWhile(doWhile)

  • while后面的()可以省略
  • 沒有非0即真和非空即真
  • do換成了repeat
var count = 0
repeat{
    print("hello")
    count += 1
}while count < 10

字符串/數(shù)組/字典

相比于OC中的字符串/字典/數(shù)組,Swift統(tǒng)一去掉了NS

  • NSString改為String
  • NSArray改為Array
  • NSDictionary改為Dictionary
提示:
不要以偏概全哦:例如OC中的NSDate在Swift中仍然是NSDate...

字符串String

  • Swift中字符串的特點(diǎn):
    • String是一個結(jié)構(gòu)體,相對于對象(NSStrign)來說性能更高
    • String支持直接遍歷
    • Swift提供了String和NSString之間的無縫轉(zhuǎn)換
  • 創(chuàng)建字符串:
    • 可變字符串
let str = "hello"
  • 不可變字符串
var strM = "hello"
strM = "hello swift"
  • 字符串的使用
    • 遍歷字符串
for character in str.characters {
            print(character)
        }
  • 獲取字符串長度
let length = str.characters.count
  • 字符串的拼接
    • 字符串與字符串之間的拼接
 let str = "lyu"
let str2 = "sim"
let str3 = str + str2
print(str3)
  • 字符串與其他標(biāo)識符之間的拼接
let name = "lyu"
let age = 18
let str3 = "name is \(name) and age is \(age)"
print(str3)
  • 字符串與其他標(biāo)識符之間的格式化拼接
let str = "lyu"
let age = 18
let str3 = String(format: "name is \(str) , age is %i" ,age)
  • 字符串的截取
    • 使用Swift原生方法截取?
let urlString = "www.lyu.com"
//由于Swift中substringWithRange中的range泛型指定為Index類型,所以才導(dǎo)致創(chuàng)建區(qū)間如下面這般麻煩
let startIndex = urlString.startIndex.advancedBy(4) //創(chuàng)建區(qū)間起始
let endIndex = urlString.endIndex.advancedBy(-5)  //創(chuàng)建區(qū)間末尾
let range = Range(startIndex...endIndex)  //創(chuàng)建區(qū)間
let name = urlString.substringWithRange(range) //截取中間
let www = urlString.substringToIndex(startIndex)  //截取到...
let com = urlString.substringFromIndex(endIndex)  //從..開始截取
  • 使用OC方法截取
 let urlString = "www.lyu.com"
let name = (urlString as NSString).substringWithRange(NSMakeRange(4, 3)) //轉(zhuǎn)換字符串,并使用OC方法來進(jìn)行截取
let com = (urlString as NSString).substringFromIndex(8)
let www = (urlString as NSString).substringToIndex(3)

數(shù)組

  • 不可變數(shù)組:
let array = ["lyu","sim"]
  • 可變數(shù)組:
        var arrayM = Array<NSObject>() //不常見的寫法,只因不夠簡潔
        var arrayM = [NSObject]()
  • 數(shù)組的基本操作(增刪改查)
        arrayM.append("lyu")  //增加字符串
        arrayM.append(18)  //增加基本數(shù)據(jù)類型
arrayM.removeAtIndex(1)  //18被刪除掉了
        arrayM[0] = "sim"
        arrayM[1] = "18"  //此例中,越界報(bào)錯
let name = arrayM[0]  //取出數(shù)組的第0個元素
  • 數(shù)組的遍歷
    • 普通for循環(huán)遍歷:這種方法在Swift 3.0中即將被取消,請遺忘
let array = ["lyu" , 18]
        for var i = 0 ; i < array.count ; i++ {
            print(array[i])
        }
  • 增強(qiáng)for循環(huán)遍歷:
 let array = ["lyu" , 18]
        for name in array {
            print(name)
        }
  • 超強(qiáng)for循環(huán)遍歷:既能拿到index,又能拿到元素(簡直碉堡)
let array = ["lyu" , 18]
for (index , name) in array.enumerate(){
        print(index)
        print(name)
}
  • 部分遍歷:如果有只遍歷數(shù)組中某部分元素的需求,那么就使用下面這種方法吧
let array = ["lyu" , 18]
for index in 0...1 {
        print(array[index])
}
  • 數(shù)組的合并
    數(shù)組的合并是有前提的:兩個數(shù)組中對應(yīng)index的元素類型必須一致,才能進(jìn)行合并
正確寫法:
        let array1 = ["name1" , 17]
        let array2 = ["lyu" , 18 , 19 , "sim"]
        let arrayT = array1 + array2
錯誤寫法:
        let array1 = ["name1" , 17]
        let array2 = ["lyu" , "sim"]
        let arrayT = array1 + array2  //編譯報(bào)錯

字典

不可思議的是,Swift中的字典仍然使用[]來創(chuàng)建(而不是{}),Swift會通過[]中的內(nèi)容來判斷自己是一個字典還是數(shù)組(如果里面存放的是鍵值對,Swift會判定其為字典,如果里面存放的是元素,Swift會判定其為數(shù)組)

  • 不可變字典
let dic = ["name" : "lyu" , "age" : 18]
  • 可變字典
        var dicM = Dictionary<NSString , NSObject>() //不常用
        var dicM = [NSString : NSObject]()
  • 可變字典的基本操作
dicM["name"] = "lyu"  //第一種方法
dicM.updateValue(18,forKey:"age")  //第二種方法

keyMessage:如果key已經(jīng)存在了,那么所謂的就變成了了哦

let name = dictM.removeValueForKey("age")  //Swift中被刪除掉的元素是可以拿到的
dictM["name"] = "lyu"
dictM.updateValue("lyu",forKey:"name")
let name = dicM["name"]
  • 字典的遍歷
    • 遍歷key
for key in dic.keys {
            print(key)
        }
  • 遍歷value
for value in dic.values {
            print(value)
        }
  • 遍歷key/value:
for (key , value) in dic {
            print(key)
            print(value)
        }
  • 字典的合并:
    然而,字典并不能合并,就算元素類型相同也不可以,不過如果真的有讓兩個字典合并為一個字典的需求,可以這樣做:
let dic = ["name" : "lyu" , "age" : 18]
var dicM = [NSString : NSObject]()  //將其中一個字典變?yōu)榭勺冏值?作為被合并的字典
dicM["height"] = 1.80  //為可變字典添加屬性
for (key,value) in dic {  //合并字典
        dicM[key] = value  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末被环,一起剝皮案震驚了整個濱河市凉倚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琅攘,老刑警劉巖窿侈,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡余蟹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門子刮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來威酒,“玉大人,你說我怎么就攤上這事挺峡】拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵橱赠,是天一觀的道長佛呻。 經(jīng)常有香客問我,道長病线,這世上最難降的妖魔是什么吓著? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮送挑,結(jié)果婚禮上绑莺,老公的妹妹穿的比我還像新娘。我一直安慰自己惕耕,他們只是感情好纺裁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著司澎,像睡著了一般欺缘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挤安,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天谚殊,我揣著相機(jī)與錄音,去河邊找鬼蛤铜。 笑死嫩絮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的围肥。 我是一名探鬼主播剿干,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穆刻!你這毒婦竟也來了置尔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤氢伟,失蹤者是張志新(化名)和其女友劉穎榜轿,沒想到半個月后幽歼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡差导,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年试躏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片设褐。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡颠蕴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出助析,到底是詐尸還是另有隱情犀被,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布外冀,位于F島的核電站寡键,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雪隧。R本人自食惡果不足惜西轩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脑沿。 院中可真熱鬧藕畔,春花似錦、人聲如沸庄拇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽措近。三九已至溶弟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞭郑,已是汗流浹背辜御。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凰浮,地道東北人我抠。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像袜茧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓣窄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容