天天看點

Swift4.0 基礎文法部分【簡述】

一、swift特性

  1. Swift 是一門開發 iOS, macOS, watchOS 和 tvOS 應用的新語言。
  2. Swift 使用變量來進行存儲并通過變量名來關聯對應的值。(與C語言類似)
  3. Swift 中,如果要處理的值不需要改變,那使用常量可以讓代碼更加安全并且更清晰地表達意圖。(能用常量就用常量)

  二、常量與變量

  1. 使用let表示常量、var表示變量。(如果代碼中有不需要改變的值,請使用 

    let

     關鍵字将它聲明為常量。隻将需要改變的值聲明為變量 var 關鍵字)
  2. 類型标注
  3. var str1: String //(聲明一個String類型,名為str1的變量)。一般來說在有賦初值的情況下不需要标注類型,swift會根據所賦的值推斷出類型。
  4. 如需定義同一類型的多個變量可采用 : 
  5. var zhao, qian, sun, li: String
  6. Swift中在進行基本運算時必須保證類型一緻,否則會出錯,相同類型之間才可以進行運算,Swift中沒有隐式轉換

  三、字元串 var str = "Hello, playground"

//for c in str.characters {

//    print(c)

//}

//字元串的拼接-格式化

let number_a = 132

let number_b = 100

let number_str = String (number_a + number_b)

let str1 = "this string is \(number_a) and \(number_b)"

let str2 = String.init(format: "%04d:%05d", number_a,number_b)

//字元串截取-轉位NSString來操作

let str3 = (str as NSString).substring(to: 2)

let str4 = (str as NSString).substring(from: 4)

let range = NSRange.init(location: 2, length: 3)

let str5 = (str as NSString).substring(with: range)

//字元串長度的判斷

str.lengthOfBytes(using: .utf8)

let str6:String = "jhhgftytyiuh09887gybgjgv"

str6.lengthOfBytes(using: .utf8)

//let strLength = lengthOfString(str7:str6)

//

//func lengthOfString(str7:String) -> (Int) {

//    guard str7.lengthOfBytes(using: .utf8) == 0 else {

//        return str7.lengthOfBytes(using: .utf8)

//    }

//    return 0

//}

  四、數組 //數組 Array let修飾不可變數組、var修飾可變數組

//定義一個可變數組

var array1:Array<String>

var array2:[String]

//定義一個不可變數組

let array3 = [1, 2, 3, 4, 8]//直接初始化的話通過值去推斷array3的類型

let array4 = [1, 2, 3, 4, "i"] as [Any]

let array5:[NSObject] = [1 as NSObject, 2 as NSObject, "x" as NSObject, 3.14 as NSObject]

//聲明數組時、需要初始化才能使用。

//先聲明在初始化

var array6:Array<String>

array6 = ["1", "2", "3"]

array6 = Array()

//聲明的同時并初始化

var array7:[String] = [String]()

var array8:Array<String> = Array()

var array9 = [1, 2, 3, 4, 5]

//Array增

array9.append(6)//增到最後位

//Array插

array9.insert(4000, at: 1)

//Array改

array9[1] = 10086

//Array删

array9.remove(at: 2)//删除第3個元素3

array9.removeAll()//清空

//取值

array9[4]

//周遊全部

for item in array9 {

    print(item)

}

//周遊部分

for item in array9[0...3] {

    print(item)

}

for item in array9[0..<3] {

    print(item)

}

//數組的合并 用+ 確定類型一緻才可以

let array10 = ["1", "2", "3"]

let array11 = ["A", "B", "C"]

let array12 = array10 + array11

  四、字典 //let修飾不可變字典 var修飾可變字典

//定義一個不可變字典、直接定義

let dict1 = ["a":"A", "b":"B", "c":"C"]

//取值

dict1["a"]

//定義一個可變字典并初始化

var dict2:[String: NSObject] = [String: NSObject]()

var dict3:Dictionary<String, Int> = Dictionary()

var dict4 = ["a":"A", "b":"B", "c":"C"]

//先定義後初始化

var dict5:Dictionary<String, String>

dict5 = ["a":"A", "b":"B", "c":"C"]

//增

dict5["e"] = "E"

dict5["愛"] = "❤️"

//dict5 = ["b": "B", "e": "E", "a": "A", "c": "C", "愛": "❤️"]

//改

dict5["愛"] = "?"

//dict5 = ["b": "B", "e": "E", "a": "A", "c": "C", "愛": "?"]

//删

dict5.removeValue(forKey: "愛")

//dict5 = ["b": "B", "e": "E", "a": "A", "c": "C"]

//查 - 用鍵查值

dict5["e"]

//清空

dict5.removeAll()

var dict6:Dictionary<String, String>

dict6 = ["1":"a","2":"b","3":"c","4":"d","5":"e","6":"f"]

//周遊字典的鍵

for key in dict6.keys {

    print(key)

}

//周遊值

for value in dict6.values {

    print(value)

}

//周遊所有的鍵值對

for (k, v) in dict6 {

    print(k, v)

}

//兩字典的合并

var dict7 = ["一":"甲", "二":"已","三":"丙"]

var dict8 = ["1":"A","2":"B","3":"C"]

//不能和數組那樣直接+ 需要周遊一個字典将鍵值加到另外一個字典上

for (key, value) in dict7 {

    dict8[key] = value

}

//dict8 = ["三": "丙", "2": "B", "1": "A", "二": "已", "一": "甲", "3": “C"]

  五、元組(Swift特有的) //寫法一:

let tump1 = ("liuhuakun", 27, "GD", 173.5)

tump1.0 //"liuhuakun"

tump1.3 //173.5

//寫法二:

let tump2 = (name:"liuhuakun", age:28, address:"GD", height:173.5)

tump2.name //"liuhuakun"

tump2.height //173.5

//寫法三

let (name, age) = ("liuhuakun", 28)

name //173.5

age //28

    七、可選類型 Optional //可選類型 - Optional值

//OC中如果有暫時不使用的變量、可以指派為0(基礎資料類型)或指派為nil(對象類型)

//Swift中nil是一個特殊類型,與真實的變量類型不一緻不能被複制(Swift為強類型語言)。但開發中确實需要用到指派為nil,這就引入了可選類型Optional(空值或有值)

//var str1:String = nil//報錯-類型不比對不能被指派

//寫法1

var str1:Optional<String> = nil

//寫法2

var str2:String? = nil //文法糖

//解包 - 當確定目前可選值有值時可解包

var str3:String? = nil

str3 = "hello"

//print(str3) //Optional("hello")

//print(str3!) //hello

//若str3為空時解包則報錯

str3 = nil

//print(str3) //nil

//print(str3!)//報錯

//1.強制解包、2.隐式解包、3.可選綁定

//1.強制解包

var a:Int? = nil

a = 7

let aa = a! //這裡對a進行強制解包 - 強制解包後 aa為7 不強制解包的話 aa為Optional(7)

print(aa)

//2.隐式解包 - 還是不太了解

var b:Int! = nil //這裡聲明對b要進行隐式解包

b = 8

let bb = b

print(bb as Any)

//可選綁定 - 在 if裡面可以友善操作 目前可選值

var str4:String? = nil

str4 = "hello"

if let string = str4 {

    print(string)

}else {

    print("nil")

}

  八、函數 //預設下函數是值傳遞 - 值傳遞 函數内部是不能去改變參數的值的。

func myFunc1(a:Int, b:Int) -> Int {

    return a+b

}

var a = 3

var b = 7

myFunc1(a: a, b: b)

//函數的指針傳遞 inout - 指針傳遞 函數内部是可以改變參數值的

func myFunc2( a:inout Int, b:inout Int) -> Int {

    a = a*b //a = 63

    b = b*b //b = 81

    return a*b //a*b = 5103

}

var x = 7

var y = 9

myFunc2(a: &x, b: &y)

x //x=63,此時x的值在函數内部被改變 x在外部也被改變了,因為傳入的是x的指針位址

y //y=81,此時y的值在函數内部被改變 y在外部也被改變了,因為傳入的是x的指針位址

  九、類 //類的使用

/// class為類關鍵字、myClass類名、:父類(可以沒有父類)

class myClass:NSObject {

    /// swift中類的屬性有多種

    //1、存儲屬性:存儲執行個體的常量和變量

    //2、計算屬性:通過某種計算方式得出的屬性

    //3、類屬性:與整個類相關的屬性

    //1、存儲屬性

    var a:Int = 88

    var b:Int = 99

    var name = "xiaohong"

    //2、計算屬性

    var totalInt:Int {

        get {

            return (a + b)/2

        }

        // 沒有意義,因為之後擷取值時依然是計算得到的

        // newValue是系統配置設定的變量名,内部存儲着新值

        set {

            self.totalInt = newValue

        }

    }

    //3、類屬性

    //類屬性是與類相關聯的,而不是與類的執行個體相關聯,類屬性的設定和修改,需要通過類來完成,類屬性使用static來修飾

    static var appleCount:Int = 100

    func myCount(num1:Int, num2:Int ) -> Int {

        return num1 + num2

    }

}

//1、外部執行個體類的對象

let my = myClass()

//2、外部調用存儲屬性和計算屬性

//my.a = 5 //外部可指派改變存儲屬性a的值

//my.b = 7 //外部可指派改變存儲屬性b的值

print(my.name) //xiaohong

my.myCount(num1: my.a, num2: my.b) //187

my.totalInt //93

//3、外部調用類屬性

//my.appleCount //用類的執行個體去調用類屬性是不可以調用的

myClass.appleCount //隻能通過類本身去調用帶 static的類屬性

myClass.appleCount = 99

print(myClass.appleCount) //99

  ///監聽屬性的變化

class Student :NSObject {

    var name: String? {

        willSet(new) {//屬性即将改變、還未改變時調用

            print("name=\(String(describing: name))")

            print("new=\(String(describing: new))")

        }

        didSet(old) {//屬性已經改變時調用

            print("name=\(String(describing: name))")

            print("old=\(String(describing: old))")

        }

    }

}

let stu = Student()

stu.name = "x"

stu.name = "huakun"

stu.name = "hakan"

轉載于:https://www.cnblogs.com/liuhuakun/p/8276945.html

繼續閱讀