一、swift特性
- Swift 是一門開發 iOS, macOS, watchOS 和 tvOS 應用的新語言。
- Swift 使用變量來進行存儲并通過變量名來關聯對應的值。(與C語言類似)
- Swift 中,如果要處理的值不需要改變,那使用常量可以讓代碼更加安全并且更清晰地表達意圖。(能用常量就用常量)
二、常量與變量
- 使用let表示常量、var表示變量。(如果代碼中有不需要改變的值,請使用
關鍵字将它聲明為常量。隻将需要改變的值聲明為變量 var 關鍵字)let
- 類型标注
- var str1: String //(聲明一個String類型,名為str1的變量)。一般來說在有賦初值的情況下不需要标注類型,swift會根據所賦的值推斷出類型。
- 如需定義同一類型的多個變量可采用 :
- var zhao, qian, sun, li: String
- 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