Swift - 基礎語法01

前言:

Swift 是一種新的編程語言,用于編寫 iOS,OS X 和 watchOS應用程序;Swift 結合了 C 和 Objective-C 的優點并且不受 C 兼容性的限制;Swift 采用安全的編程模式并添加了很多新特性,這將使編程更簡單,更靈活,也更有趣;Swift 是基于成熟而且倍受喜愛的 Cocoa 和 Cocoa Touch 框架,它的降臨將重新定義軟件開發;目前有些公司的新項目已經直接采用 Swift 開發,所以學習Swift是必不可少的.

常量和變量:
/*:
常量定義格式
* 聲明符號 常量名稱: 類型標注
* let number: Int
* 特點: 一旦設定就不能改變
*/
let number: Int = 10
/*:
定義變量格式
* 聲明符號 變量名稱: 類型標注
* var number: Int
* 特點: 變量的值可以隨意更改
* 注意: 一般來說你很少需要寫類型標注。如果你在聲明常量或者變量的時候賦了一個初始值,Swift可以推斷出這個常量或者變量的類型
*/
var number2: Int = 10
number2 = 20

/*:
元組
* 元組(tuples)把多個值組合成一個復合值
* 將多個相同或者不同類型的值用一個小括號括起來就是一個元祖
* 元組內的值可以是任意類型,并不要求是相同類型
* 作為函數返回值時,元組非常有用

注意:
* 元組在臨時組織值的時候很有用,但是并不適合創建復雜的數據結構。如果你的數據結構并不是臨時使用,請使用類或者結構體而不是元組
*/

let tuples = (10, 10.1)

//: 通過下標
tuples.0
tuples.1

//: 指定元素名稱
let tuples1 = (xxx: 99,ooo: 3.14)
tuples1.xxx
tuples1.ooo

//: 分解元素
let (intValue, doubleValue) = (998, 4.1)
intValue
doubleValue
分支:
/*:
Swift 提供了類似 C 語言的流程控制結構(if/switch/for/while/dowhile)
分支if
* 只能以Bool作為條件語句
* 條件語句不需要加()
* {}不能省略
* Swift中if分支的模式可以使用where語句來判斷額外的條件
* 其它和OCif一樣
*/
let number = 10
if number == 10 {
    print("等于10")
}

if number >= 10 && number <= 20 {
    print("等于10")
}
  • Bool類型
Bool類型
* C語言和OC并沒有真正的Bool類型
* OC語言的Bool類型YES/NO是`typedef signed char BOOL;`非0即真

Swift引入了真正的Bool類型true/false
* Swift中沒有C和OC中非零即真的概念
* Swfit中邏輯值只有兩個true/false
* 如果你在需要使用Bool類型的地方使用了非布爾值,Swift 的類型安全機制會報錯
  • 三目運算
三目運算符
* 三目運算符的特殊在于它是有三個操作數的運算符, 它簡潔地表達根據問題成立與否作出二選一的操作
* 格式: 問題 ? 答案1 : 答案2

提示:
* Swift中三目運算符用得很多

注意:
* 過度使用三目運算符會使簡潔的代碼變的難懂。我們應避免在一個組合語句中使用多個三目運算符
  • Switch
* OC中case后面必須加上break否則會貫穿, Swift不用
* Swift中如果想貫穿必須使用fallthrough
* OC中可以不寫default,Swift中只有滿足所有條件才能忽略default
* OC中default位置可以隨便放,Swift不可以
* OC中在case中定義變量需要加大括號, 否則作用域混亂, Swift不用加大括號
* Swift中的switch可以判斷區間和元祖
* Swift中case 分支的模式可以使用where語句來判斷額外的條件
let age = 18
switch age {
    case 0:
        print("剛出生")
    case 18:
        print("剛成年")
        fallthrough
    case 40:
        print("一枝花")
    default:
        print("other")
}
可選類型:
* 可選類型表示變量可以有值, 也可以沒有值
* C 和 Objective-C 中并沒有可選類型這個概念
* Swift中只有可選類型才可以賦值為nil
* 如果你聲明一個可選常量或者變量但是沒有賦值,它們會自動被設置為nil

* 格式: Optional<類型>  或 在類型后面加上?號

可選類型的取值是一個枚舉
* None 沒有值
* Some 有值

* 由于可選類型在Swift中隨處可見, 所以系統做了一個語法糖, 在類型后面加上?
注意:
* nil不能用于非可選的常量和變量。如果你的代碼中有常量或者變量需要處理值缺失的情況,請把它們聲明成對應的可選類型。
* Swift 的nil和 Objective-C 中的nil并不一樣。在 Objective-C 中,nil是一個指向不存在對象的指針, 所以Objective-C只有對象類型才能被設置為nil(基本類型不行)。在 Swift 中,nil不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選狀態都可以被設置為nil,不只是對象類型。

var number2: Double?
number2 = 20.1
number2 = nil

Swift中可選類型的值不能當做普通類型的值來使用
如果想使用可選類型的值必須進行解包操作
只需要在變量/常量后面加上! 就可以解包
解包代表著告訴系統, 該變量/常量中一定有值

var number3: Double
number3 = 3.14

print(number2)
print(number2!)
print(number3)
let sum = number2! + number3
  • 強制解析
/*
強制解析(forced unwrapping)
* init? 構造函數, ?表示不一定能夠實例化出對象
* !表示告訴編譯器一定有值, 編譯能夠通過, 如果運行時沒有值就會直接崩潰
* 提示: ? 和 ! 是所有剛剛接觸Swift的OC程序員最最蛋疼的問題, 前期開發要注意多看文檔和利用編譯器提示解決(option + click)
注意
* 在Swift開發中, 盡量不要使用強制解包, 不安全
*/

let url = NSURL(string: "http://image.baidu.com/search/detail?ct=503316480&z=0&tn=baiduimagedetail&ipn=d&cl=2&cm=1&sc=0&lm=-1&ie=gbk&pn=0&rn=1&di=147061048200&ln=30&word=%CD%BC%C6%AC&os=2375022793,1835605452&cs=4271053251,2424464488&objurl=http%3A%2F%2Fpic55.nipic.com%2Ffile%2F20141208%2F19462408_171130083000_2.jpg&bdtype=0&simid=4247939438,550168575&fr=ala&ala=1&alatpl=others&pos=1")
print(url)
  • 可選綁定
/*:
可選綁定(optional binding)
* 不需要考慮url是否有值, 能進入{}一定有值
* 不僅可以用來判斷可選類型中是否有值,同時可以將可選類型中的值賦給一個常量或者變量
* 可選綁定可以用在if和while語句中

提示:
* 在實際開發中,使用頻率很高

注意:
* 可選綁定中的變量/常量只能在if后面的{}中使用
*/

if let temp = url {
    print(temp)
}

let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40

if let temp1 = value1 {
    if let temp2 = value2 {
        if let temp3 = value3 {
            if let temp4 = value4 {
                let sum = temp1 + temp2 + temp3 + temp4
            }
        }
    }
}
  • guard
/*:
guard
* guard語句是在Swift 2.0中引進的,它是用途是在未滿足某個條件時,提供一個退出的路徑
* 格式: guard 表達式 else{}
注意:
* guard中的變量/常量 可以在guard后面使用
* guard一般用于避免使用強制拆包, 優化代碼結構
*/
func test(){
    let value1: Int? = 10
    let value2: Int? = 20
    let value3: Int? = 30
    let value4: Int? = 40
    
    guard let temp1 = value1 else{
        return
    }
    guard let temp2 = value2 else{
        return
    }
    guard let temp3 = value3 else{
        return
    }
    guard let temp4 = value4 else{
        return
    }
    let sum = temp1 + temp2 + temp3 + temp4
    print(sum)
}
test()
  • 隱式可選類型
/*
隱式解析可選類型(implicitly unwrapped optionals)
* 有時候在程序架構中,第一次被賦值之后,可以確定一個可選類型_總會_有值。在這種情況下,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值
* 隱式解析可選類型, 并不需要每次都使用解析來獲取可選值, 一個隱式解析可選類型其實就是一個普通類型,但是可以被當做非可選類型來使用
* 格式: 將可選類型后面的?改為!
* let xmgButton: UIButton!

注意:
* 如果一個變量之后可能變成nil的話請不要使用隱式解析可選類型。如果你需要在變量的生命周期中判斷是否是nil的話,請使用普通可選類型
*/

let intValue: Int?
intValue = 10
print(intValue)
print(intValue!)

if intValue != nil {
    print(intValue!)
}

if let temp = intValue {
    print(temp)
}

var doubleValue: Double!
doubleValue = nil
doubleValue = 3.14
print(doubleValue)
循環
  • for循環
/*:
for循環
* 閉區間: 包含區間內所有值  a...b 例如: 1...5
* 半閉區間: 包含頭不包含尾  a..<b  例如: 1..<5
其它寫法
* Swift1.0版本寫法 0..10
*/
for i in 0..<10 {
    print(i)
}
  • while循環
//: while循環, 每次在循環開始時計算條件是否符合
var count = 0
while count < 10 {
    print(count)
    count++
}

count = 0
print(count)
  • repeat-while
//: repeat-while, 每次在循環結束時計算條件是否符合
repeat {
    print(count)
    count++
}while count < 10
print(count)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容