Swift 基本使用

Swift:蘋果在2014年推出的面向?qū)ο箝_發(fā)的語言,用來撰寫OS X 和 iOS 應(yīng)用程序的強類型語言,順帶提一下Chris Lattner~克里斯·拉特納Swift的親爹,Swift的大部分基礎(chǔ)架構(gòu)均由他1人完成,他本人也對Swift的開源化作出了貢獻(xiàn).

語言特點:讓開發(fā)變得 ---> 簡快穩(wěn)

  • 語法簡單、代碼簡潔懊蒸、使用方便
  • 可以和Objective-C混合使用;
  • 提供了命名空間(namespace)垄懂、泛型(generic)谅辣、運算對象的重載(operator overloading)

Swift基本語法

  • 導(dǎo)入框架import UIKit
  • 語句結(jié)束不需要加 ;
  • 打印語句print(內(nèi)容)
  • 定義標(biāo)識符時,必須聲明標(biāo)識符是變量還是常量 ,使用let聲明常量,使用var聲明變量.標(biāo)識符的類型必須和你賦給它們的值一樣.聲明的同時賦值,編譯器會自動判斷類型的方式稱作類型推導(dǎo)
import UIKit
var a = 20
a = 30
var b : Int = 40
let value1 = 7.0
let value2 :Double = 7.77

Swift中基本運算

Swift中在進(jìn)行基本運算時必須保證類型一致,同類型之間才可以進(jìn)行運算,Swift中沒有隱式轉(zhuǎn)換

let label = "hello world "
let width = 50
let widthLabel = label + String(width)
print(widthLabel) // "hello world 50"

if語句

  • 判斷句可以不加()
  • 判斷句中必須有明確的真假(不再有非0即真)
  • 條件必須是Bool表達(dá)式,取值:true/false
let score = 87

if score < 60 {
    print("不及格")
} else if score <= 70 {
    print("及格")
} else if score <= 80 {
    print("良好")
} else if score <= 90 {
    print("優(yōu)秀")
} else {
    print("完美")
}

三目運算符

var a = 10
var b = 50

var result = a > b ? a : b
println(result) // 50

guard的使用

  • guard是Swift新增語法.
  • guard語句必須帶有else語句當(dāng)條件表達(dá)式為true時候跳過else語句中的內(nèi)容挠进,執(zhí)行語句組內(nèi)容;條件表達(dá)式為false時候執(zhí)行else語句中的內(nèi)容爽室,跳轉(zhuǎn)語句一般是return亿遂、break吃既、continue和throw
guard 條件 else {
    //條件語句
    break
}
代碼...

例:

var age = 18

func online(age : Int) -> Void {
    guard age >= 18 else {
        print("回家去")
        return
    }

    print("可以上網(wǎng)")
}

online(age) // 可以上網(wǎng)

switch

  • 蘋果對switch進(jìn)行了加強,swich后可以不加() ,case后可以不跟break(默認(rèn)會有)
let sex = 0

switch sex {
case 0 :
    print("男")
case 1 :
    print("女")
default :
    print("其他")
}

  • 一個case可以判斷多個值 以,隔開
let sex = 0

switch sex {
case 0, 1:
    print("正常人")
default:
    print("其他")
}
  • case的穿透,可以使用關(guān)鍵字fallthrough
let sex = 0

switch sex {
case 0:
    fallthrough
case 1:
    print("正常人")
default:
    print("其他")
}
  • 支持多種數(shù)據(jù)類型:字符串,浮點型,重點提一下區(qū)間型
    開區(qū)間: 0..<10 表示:0-9
    閉區(qū)間: 0...10 表示:0-10
let score = 88

switch score {
case 0..<60:
    print("不及格")
case 60..<80:
    print("幾個")
case 80..<90:
    print("良好")
case 90..<100:
    print("優(yōu)秀")
default:
    print("滿分")
}

循環(huán):for/while/do while

//一般寫法
for var i = 0; i < 5; i++ {
    print(i)
}
//特殊寫法:如果不需要用到下角標(biāo)
for _ in 0..<5 {
    print("666666")
}
//需要用到下角標(biāo)的區(qū)間循環(huán)
for i in 0..<5 { // 0-4
    print(i)
}

for i in 0...5 { // 0-5
    print(i)
}
//while后面()可以省略
var a = 0
while a < 10 {
    a++
}
//do while循環(huán):使用repeat關(guān)鍵字代替do
var b = 0
repeat {
    print(b)
    b++
} while b < 10

Swift中的字符串String

OC和Swift中字符串的區(qū)別:

  • 在OC中字符串類型時NSString,在Swift中字符串類型是String
  • OC中字符串@"",Swift中字符串""
  • String 是一個結(jié)構(gòu)體,性能更高
  • NSString 是一個 OC 對象号显,性能略差
  • String 支持直接遍歷
  • Swift 提供了 String 和 NSString 之間的無縫轉(zhuǎn)換
//字符串的遍歷
var str = "Hello, Swift"
for c in str.characters {
    print(c)
}
//字符串的拼接
let str1 = "Hello"
let str2 = "World"
let str3 = str1 + str2 // "HelloWorld"

//和其他數(shù)據(jù)類型的拼接 使用 \\\\\\\\()
let name = "shei"
let age = 18
let info = "my name is \\\\\\\\(name), age is \\\\\\\\(age)"

//字符串的格式化
let min = 3
let second = 4
let time = String(format: "%02d:%02d", arguments: [min, second]) // 03:04

//字符串的截取
//只提簡單的方式,將String轉(zhuǎn)成NSString來使用.格式:(標(biāo)識符 as NSString)
let myStr = "www.baidu.com"
var subStr = (myStr as NSString).substringFromIndex(2)
subStr = (myStr as NSString).substringToIndex(3)
subStr = (myStr as NSString).substringWithRange(NSRange(location: 4, length: 5))

數(shù)組(Array):你猜對了沒有NS開頭,swift中的數(shù)組是一個泛型集合.let修飾不可變數(shù)組;var修飾可變數(shù)組.

//聲明一個Array類型
var array1:Array<String>
var array2: [String]

// 定義一個可變數(shù)組,必須初始化才能使用
var array3 : [String] = [String]()
// 定義一個不可變數(shù)組
let array4 : [NSObject] = ["666", 66]

// 定義時直接初始化
var array5 = ["Sasuke", "Naruto", "Sakura"]
// 先定義,后初始化
var array6 : Array<String>
array6 = ["Sasuke", "Naruto", "Sakura"]

//對數(shù)組的操作 
//增
array6.append("abc")
//刪
array6.removeLast()
//改
array6[0] = "IU"
//查
array6[2]

//數(shù)組的遍歷
// 遍歷數(shù)組
for i in 0..<array6.count {
    print(array6[i])
}

// forin方式
for item in array6 {
    print(item)
}

// 設(shè)置遍歷的區(qū)間
for item in array6[0..<2] {
    print(item)
}

//數(shù)組的合并
// 注意:只有相同類型的數(shù)組才能合并
var huo = ["Sasuke", "Naruto"]
var ying = ["Sakura"]
var huoYing = huo + ying;

字典:swift中的字典Dictionary,是個泛型集合

// 定義一個可變字典
var dict1 : [String : NSObject] = [String : AnyObject]()
// 定義一個不可變字典
let dict2 = ["name" : "Sakura", "age" : 18]

//聲明
var dict3: Dictionary<Int, String>
var dict4: [Int: String]

// 定時字典的同時,進(jìn)行初始化
var dict = ["name" : "Sakura", "age" : 18]
// swift中任意對象,通常不使用NSObject,使用AnyObject
var dict : Dictionary<String, AnyObject>
dict = ["name" : "Sakura", "age" : 18]

//增
dict["height"] = 1.75
dict["weight"] = 62.0
//刪
dict.removeValueForKey("name")
//改
dict["name"] = "abc"
//查
dict["name"]

//遍歷字典
// 遍歷字典中所有的值
for value in dict.values {
    print(value)
}
// 遍歷字典中所有的鍵
for key in dict.keys {
    print(key)
}

// 遍歷所有的鍵值對
for (key, value) in dict {
    print(key)
    print(value)
}

//字典的合并:字典不可以相加合并
var dict1 = ["name" : "hz", "age" : 20]
var dict2 = ["height" : 1.80, "phoneNum" : "114"]
for (key, value) in dict1 {
    dict2[key] = value
}

元組

  • 元組:swift中特有的,它是一種數(shù)據(jù)結(jié)構(gòu),類似字典或數(shù)組,用于定義一組數(shù)據(jù),內(nèi)容成為元素.
//使用方法一
let man = ("mfk",27)
print(man.0) //通過.角標(biāo)的形式取值
print(man.1)

//使用方法二
let man = (name : "mfk", age : 27)
print(man.name) //通過取別名的方式取出值
print(man.age)

//使用方法三
let (name, age)= ( "mfk",  27)
print(name) 
print(age)

可選類型:在swift開發(fā)中,nil是一個特殊的類型,由于賦值時要明確真實類型,所以不能賦值為nil.但開發(fā)中需要賦值nil,因此推出可選類型.

  • 取值包括空值和有值
  • 定義可選類型一般使用語法糖
//定義的一般寫法
let name : Optional<String> = nil // 使用關(guān)鍵字Optional
//語法糖
let name : String? = nil //可選類型中只能存放字符串
name = "mfk"
print(name)  // Optional("mfk")\\\\\\\\n 打印結(jié)果是可選類型的字符串

print(name!) //mfk\\\\\\\\n 相當(dāng)是一個強制解包操作,此操作是危險的
//注意:若果可選類型是nil,強制解包,系統(tǒng)會報錯.要進(jìn)行一次判斷
if name != nil {
   print(name!)
}
//簡單寫法(可選綁定)
if let nameStr = name {
   print(nameStr)
}

函數(shù)

  • 格式: func 函數(shù)名(標(biāo)識符 : 數(shù)據(jù)類型 , 等等) -> 返回值類型 {
    代碼塊
    return 返回值
    }
  • func為關(guān)鍵字,形參列表內(nèi)多個參數(shù)之間用,號隔開(可以沒有參數(shù)).箭頭是指向的意思,沒有返回值可以寫Void,也可以省略不寫,具體看代碼部分
// 1.沒有參數(shù),沒用返回值
func about() -> Void {
    print("666666")
}
// 調(diào)用函數(shù)
about()

// 簡單寫法
// 如果沒用返回值,Void可以寫成()
func about1() -> () {
    print("666666")
}
// 如果沒有返回值,后面的內(nèi)容可以都不寫
func about2() {
    print("666666")
}

about2()

// 2.有參數(shù),沒用返回值
func callPhone(phoneNum : String) {
    print("打電話給\\\\\\\\(phoneNum)")
}
callPhone(" 110")

// 3.沒用參數(shù),有返回值
func readMessage() -> String {
    return "吃飯了嗎?"
}
var str = readMessage()
print(str)

// 4.有參數(shù),有返回值
func sum(num1 : Int, num2 : Int) -> Int {
    return num1 + num2
}
var result = sum(20, num2: 30)
print(result)
  • 在函數(shù)內(nèi)部可以看到的參數(shù),就是內(nèi)部參數(shù)
    在函數(shù)外面可以看到的參數(shù),就是外部參數(shù)
    默認(rèn)情況下,從第二個參數(shù)開始,參數(shù)名稱既是內(nèi)部參數(shù)也是外部參數(shù)
    如果第一個參數(shù)也想要有外部參數(shù),可以設(shè)置標(biāo)簽:在變量名前加標(biāo)簽即可
    如果不想要外部參數(shù),可以在參數(shù)名稱前加_
// num1和a是外部參數(shù)的名稱
func ride(num1 num1 : Int, a num2 : Int, b num3 : Int) -> Int {
    return num1 * num2 * num3
}
var result1 = ride(num1: 20, a: 4, b: 5)

// 方法的重載:方法名稱相同,但是參數(shù)不同,可以稱之為方法的重載(了解)
func ride(num1: Int, _ num2 :Int) -> Int {
    return num1 * num2
}

var result2 = ride(20, 20)
  • 默認(rèn)參數(shù):若果沒有傳入具體的參數(shù),可以使用默認(rèn)參數(shù)
func giveme(type :String = "coffee") -> String {
    return "給我\\\\\\\\(type)臭猜。"
}

let me1 = giveme("面包") //給我面包
let me2 = giveme()  // 給我coffee

  • 可變參數(shù): 可以接受不確定數(shù)量的輸入類型參數(shù),它們必須具有相同的類型,通過在參數(shù)類型名后面加入(...)的方式來指示這是可變參數(shù)
func sum(numbers:Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total
}

sum(100.0, 200, 300)
sum(3.3, 10.1)
  • 引用類型(指針類型):默認(rèn)情況下,函數(shù)的參數(shù)是值傳遞.如果想改變外面的變量,則需要傳遞變量的地址,必須是變量,因為需要在內(nèi)部改變其值,Swift提供的inout關(guān)鍵字就可以實現(xiàn)
// 函數(shù)一:值傳遞
func swap(var a : Int, var b : Int) {
    let temp = a;
    a = b;
    b = temp

    print("a:\\\\\\\\(a), b:\\\\\\\\(b)")
}

var a = 10
var b = 20
swap(a, b: b)
print("a:\\\\\\\\(a), b:\\\\\\\\(b)")

// 函數(shù)二:指針的傳遞
func swap1(inout a : Int, inout b : Int) {
    let temp = a
    a = b
    b = temp

    print("a:\\\\\\\\(a), b:\\\\\\\\(b)")
}

swap1(&a, b: &b)
print("a:\\\\\\\\(a), b:\\\\\\\\(b)")
  • 函數(shù)的嵌套使用:swift中func可以嵌套使用,方法不推薦(可閱讀性差),不多舉例子

Swift 中的類

  • Swift 中class為定義類的關(guān)鍵字,定義的類,可以沒有父類.那么該類是rootClass,通常,定義類時繼承自NSObject(非OC的NSObject)
  • 類的屬性
    (1)存儲屬性:存儲實例的常量和變量
    • 存儲屬性是最簡單的屬性,它作為類實例的一部分,用于存儲常量和變量;可以給存儲屬性提供一個默認(rèn)值,也可以在初始化方法中對其進(jìn)行初始化.
class Student : NSObject {
    // 定義屬性
    // 存儲屬性
    var age : Int = 0
    var name : String?

    var chineseScore : Double = 0.0
    var mathScore : Double = 0.0
}

// 創(chuàng)建學(xué)生對象
let stu = Student()

// 給存儲屬性賦值
stu.age = 10
stu.name = "why"

stu.chineseScore = 89.0
stu.mathScore = 98.0

(2) 計算屬性:通過某種方式計算出來的屬性

  • 計算屬性并不存儲實際的值,而是提供一個getter和一個可選的setter來間接獲取和設(shè)置其它屬性,計算屬性一般只提供getter方法,則該計算屬性為只讀屬性,并且可以省略get{}
class Student : NSObject {
    // 定義屬性
    // 存儲屬性
    var age : Int = 0
    var name : String?

    var chineseScore : Double = 0.0
    var mathScore : Double = 0.0

    // 計算屬性
    var averageScore : Double {
        get {
            return (chineseScore + mathScore) / 2
        }

        // 沒有意義,因為之后獲取值時依然是計算得到的
        // newValue是系統(tǒng)分配的變量名,內(nèi)部存儲著新值
        set {
            self.averageScore = newValue
        }
    }
}

// 獲取計算屬性的值
print(stu.averageScore)

(3) 類屬性:與整個類自身相關(guān)的屬性

  • 類屬性是與類相關(guān)聯(lián)的咙轩,而不是與類的實例相關(guān)聯(lián)
    所有的類和實例都共有一份類屬性.因此在某一處修改之后,該類屬性就會被修改,類屬性的設(shè)置和修改,需要通過類來完成
class Student : NSObject {
    // 定義屬性
    // 存儲屬性
    var age : Int = 0
    var name : String?

    var chineseScore : Double = 0.0
    var mathScore : Double = 0.0

    // 計算屬性
    var averageScore : Double {
        get {
            return (chineseScore + mathScore) / 2
        }

        // 沒有意義.newValue是系統(tǒng)分配的變量名,內(nèi)部存儲著新值
        set {
            self.averageScore = newValue
        }
    }

    // 類屬性
    static var corseCount : Int = 0
}

// 設(shè)置類屬性的值
Student.corseCount = 3
// 取出類屬性的值
print(Student.corseCount)

監(jiān)聽屬性的改變

  • 在OC中我們可以重寫set方法來監(jiān)聽屬性的改變
  • Swift中可以通過屬性觀察者來監(jiān)聽和響應(yīng)屬性值的變化
  • 通常是監(jiān)聽存儲屬性和類屬性的改變.(對于計算屬性获讳,我們不需要定義屬性觀察者,因為我們可以在計算屬性的setter中直接觀察并響應(yīng)這種值的變化)
  • 我們通過設(shè)置以下觀察方法來定義觀察者
    • willSet:在屬性值被存儲之前設(shè)置活喊。此時新屬性值作為一個常量參數(shù)被傳入丐膝。該參數(shù)名默認(rèn)為newValue,我們可以自己定義該參數(shù)名
    • didSet:在新屬性值被存儲后立即調(diào)用钾菊。與willSet相同帅矗,此時傳入的是屬性的舊值,默認(rèn)參數(shù)名為oldValue
    • willSet與didSet只有在屬性第一次被設(shè)置時才會調(diào)用煞烫,在初始化時浑此,不會去調(diào)用這些監(jiān)聽方法
//監(jiān)聽age和name的變化
class Person : NSObject {
    var name : String? {
        // 可以給newValue自定義名稱
        willSet (new){ // 屬性即將改變,還未改變時會調(diào)用的方法
            // 在該方法中有一個默認(rèn)的系統(tǒng)屬性newValue,用于存儲新值
            print(name)
            print(new)
        }
        // 可以給oldValue自定義名稱
        didSet (old) { // 屬性值已經(jīng)改變了,會調(diào)用的方法
            // 在該方法中有一個默認(rèn)的系統(tǒng)屬性oldValue,用于存儲舊值
            print(name)
            print(old)
        }
    }
    var age : Int = 0
    var height : Double = 0.0
}

let p : Person = Person()

// 在賦值時,監(jiān)聽該屬性的改變
// 在OC中是通過重寫set方法
// 在swift中,可以給屬性添加監(jiān)聽器
p.name = "why"

//p.name = "yz"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滞详,隨后出現(xiàn)的幾起案子凛俱,更是在濱河造成了極大的恐慌紊馏,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒲犬,死亡現(xiàn)場離奇詭異朱监,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)原叮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門赫编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奋隶,你說我怎么就攤上這事擂送。” “怎么了唯欣?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵嘹吨,是天一觀的道長。 經(jīng)常有香客問我境氢,道長躺苦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任产还,我火速辦了婚禮,結(jié)果婚禮上嘀趟,老公的妹妹穿的比我還像新娘脐区。我一直安慰自己,他們只是感情好她按,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布牛隅。 她就那樣靜靜地躺著,像睡著了一般酌泰。 火紅的嫁衣襯著肌膚如雪媒佣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天陵刹,我揣著相機(jī)與錄音默伍,去河邊找鬼。 笑死衰琐,一個胖子當(dāng)著我的面吹牛也糊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羡宙,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼狸剃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狗热?” 一聲冷哼從身側(cè)響起钞馁,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤虑省,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后僧凰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體探颈,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年允悦,在試婚紗的時候發(fā)現(xiàn)自己被綠了膝擂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡隙弛,死狀恐怖架馋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情全闷,我是刑警寧澤叉寂,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站总珠,受9級特大地震影響屏鳍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜局服,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一钓瞭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淫奔,春花似錦山涡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唐责,卻和暖如春鳞溉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鼠哥。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工熟菲, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朴恳。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓科盛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親菜皂。 傳聞我的和親對象是個殘疾皇子贞绵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

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