天天看點

swift基礎(一)

    • 常量和變量
    • 數組
    • 字典
    • 字元串
    • 元組tuples
    • 自動推導
    • 可選項optional 可選類型
    • 邏輯分支
    • 可選類型的判斷
    • 指定類型
    • 循環
    • 枚舉關聯值與值綁定模式
    • 通配符模式Wildcard Pattern
    • 辨別符模式Identifier Pattern
    • 值綁定模式Value-Binding Pattern

常量和變量

常量&變量的使用原則:

盡量先用 let,隻有需要變的時候,再用 var,能夠更加安全

// 定義變量
var i = 
print(i)

i = 
print(i)

//: 定義常量
let j = 

// 常量一經定義不能自改數值
//j = 25
print(j)
           

數組

格式:[] / Int / Array()

let 不可變數組

var 可變數組

初始化數組

var mutableArray = [Any]()
mutableArray.append("當我唱起這首歌")
mutableArray.append("小紅帽和大灰狼")

for arr in mutableArray {
    print(arr)
}
           

定義數組

let array:[Any] = ["lnj", "lmj"]
           

周遊

for arr in array {
    print(arr)
}
           

在swift中 數組可以存放任意類型

var mutableArray2 = ["停在這裡", , ] as [Any]
           

數組的基本操作

//增
mutableArray2.append("456")

for arr in mutableArray2 {
    print(arr)
}

//合并數組
mutableArray += array

for arr in mutableArray {
    print("合并完的數組元素\(arr)")
}

//删
mutableArray.remove(at: )

for arr in mutableArray {
    print("删除完數組中第一個元素\(arr)")
}

print(mutableArray.count)

//修改-替換
let range:CountableRange<Int> = (.<)

mutableArray.replaceSubrange(range, with:[])


for (index,str) in mutableArray.enumerated() {
    print("\(index):\(str)")
}

for arr in mutableArray {
    print("替換完的數組元素\(arr)")
}

print(mutableArray.count)

mutableArray[] = "fja;s"
for arr in mutableArray {
    print("替換完的數組元素\(arr)")
}

//添加
let addArrar:[Any] = ["後者添加1", "後者添加2", "後者添加3"]
mutableArray.append(addArrar)

for arr in mutableArray {
    print("後者添加過的數組元素\(arr)")
}

//插入
mutableArray.insert(, at: )
print(mutableArray[])

mutableArray.insert(contentsOf: addArrar, at: )
for arr in mutableArray {
    print("插入完的數組元素\(arr)")
}
           

字典

格式 [:]

let不可變字典

var 可變字典

var dict:[String: NSObject]
dict = [String: NSObject]()
let sex: Bool = true
dict = ["name":"張麗", "age":, "weight":, "height":, "sex":sex] as [String: Any] as! [String : NSObject]
           

周遊字典

for (k, v) in dict {
    print("\(k) = \(v)")
}
           

擷取元素

print("根據key值name取值 == \(String(describing: dict["name"]))")
print(dict["age"] as Any)
           

字典的基本操作

添加元素 如果key值不存在會新增
dict["gender"] = "man" as NSObject
dict

//替換元素
dict["sex"] = "woman" as NSObject
dict

//删除元素
dict.removeValue(forKey: "height")

//合并字典
var dict2 = ["score": ]
for (k1, v1) in dict2 {
    dict[k1] = v1 as NSObject
}

for (k, v) in dict {
    print("\(k) = \(v)")
}
           

字元串

swift中的字元串是一個結構體,支援周遊

oc中的字元串是一個對象

swift中的字元串String和oc中的NSString可以很友善的進行轉換

oc語言中的字元串是以\0結尾的,swift不是

var stringValue2 = "abc\0efg"
print(stringValue2)

var string = "面帶微笑着"
for c in string {
    print(c)
}
           

字元串基本操作

//字元串拼接
var str2 = "假裝過頭了"
string += str
print(string)

let age:Int? = 
let name = "小賤"

//字元串拼接的時候,如果是可選項,要特别注意,帶上Optional
let str3 = "name = \(name), age = \(age!)"
print(str3)

//需要格式拼接 00:00:00
let formaterStr = String(format: "%02d:%02d:%02d", arguments: [, , ])
print(formaterStr)

//字元串截取,建議使用NSString
let str4 = "小二郎,上學堂"
//将String字元串轉換成NSString
let nsStr: NSString = str4 as NSString
print("nsStr = \(nsStr)")
let subStr = nsStr.substring(with: NSMakeRange(, ))
let resultStr = nsStr.substring(with: NSMakeRange(, )) + nsStr.substring(with: NSMakeRange(, ))
print(subStr)

//字元串轉數組
let strArray = str4.components(separatedBy: ",")
for c in strArray {
    print(c)
}

//數組轉字元串
let arrays = ["麗莎娜", "liability", "禮拜"]
let arrayStr = arrays.joined(separator: ",")
print(arrayStr)
           

元組(tuples)

可以使用一個變量來存儲多個不同類型的值,把多個值組合成複合值

元組中的值可以是任意類型,并不要求是相同類型

let person = ("張三", , )
let personTwo = (twoName:"zhangli", twoAge:)
           

從元組中取值

let (personName, personAge, personWeight) = person
print("姓名 == \(personName) 年齡 == \(personAge) 體重 == \(personWeight)")
//輸出單斜杠 \
print("\\")
print("/")
print(personTwo.twoName)
print(personTwo.twoAge)
           

如果隻是取部分值,那麼其他的可以用下劃線“_”代替

let (pName, _, _) = person
print(pName)
           

函數傳回值可以是多個,OC中函數的傳回值 隻有一個

func personFunc () ->(String,Int,Int) {
    return ("asdf",,)
}

let dic = ["sdf":"asdf","age":] as [String : Any]
for (k, v) in dic {
    print(k)
    print(v)
}
           

元組在switch語句中使用

let pointTuples = (, )
switch pointTuples {
case (, ):
    print("坐标原點")
case (., .):
    print("x 和 y 坐标範圍是位于1-10之間的")
case (_, ):
    print("點在X軸上")
case (, _):
    print("點在Y軸上")
default:
    print("其他")
}
           

自動推導

能夠根據右邊的代碼,推導出變量的準确類型

let num = 
print(#function)

let view = UIView(frame:CGRect(x: , y: , width: , height: ))
//修改視圖屬性,依然使用常量(沒有修改視圖的指針位址)
view.backgroundColor = UIColor.red

//如果需要指定變量和常量的類型,可以使用 let x:類型 = 值
let a: Int = 
print(a)
           

可選項optional 可選類型

常量使用之前必須初始化 不同類型之間的值不可以直接運算,如果沒有值則預設nil,不是任何資料類型,不參與計算

let oy:Int?
oy = 
// “ !”強行解包,在可選值中選擇非空值,如果值初始化nil,會崩潰
print(oy!)

let oy1:Int? = 
print(oy1!)
           

邏輯分支

條件不需要(),語句必須有{}

//>、簡單的分支
if j <  {
    print(true)
} else {
    print(false)
}

//>、三目(三目文法和OC一樣)
i >  ? print(true) : print(false)

//>、switch
/*
 、switch 可以針對任意類型的值進行分支,不再局限整數
 、switch 一般不需要break
 、switch 如果多時,使用‘,’
 、所有的分支至少需要一條指令,如果什麼都不幹,才使用break
 */

func abc (num:String){
    demo(num: "sf")
}

func demo(num:String) {
    switch num {
    case "10", "9":
        print("優")
    case "6":
        print("中")
    case "6":
        print("差")
    default:
        print("一般")
    }
}

let point = CGPoint(x: , y: )
switch point {
case let p where p.x ==  && p.y == :
    print("原點")
default:
    print("其他點")
}
           

可選類型的判斷

if let 和 guard let 的技巧

//使用同名的變量接收者,在後續使用的都是非空值,不需要解包;(可以避免命名的煩惱)

guard 守衛、守護

guard let 和 if let 剛好相反

let name:String? = "王五"
var age =

if let name = name {
    print(name + String(age))
} else {
    print("姓名或者年齡為空")
}

if name != nil {
    print(name! + String(age))
} else {
    print("姓名或者年齡為空")
}


//guard let 守護一定有值,如果沒有直接傳回

func demo2() {
    guard name != nil else {
        print("姓名或者年齡為 nil")
        return
    }
}
           

guard let 守護一定有值,如果沒有直接傳回

func demo2() {

guard name != nil else {

print(“姓名或者年齡為 nil”)

return

}

}

func demo3() {
    if name != nil && age > {
        print(name! + String(age) + "房間打掃了")
        return
    }
}
           

if let 連用,判斷對象是否為 nil ,{}内一定有值,不需要解包,可以直接使用

if var 連用,{}内可以對值進行修改

if let oName = name, var ageA = age {
    age = 
}
print(age)
           

?? 是一個簡單的三目

如果有值,使用值

沒有值,使用 ?? 後邊的值代替

?? 優先級比較低,在使用的時候最好加上 ()

指定類型

在swift中不會做隐式轉換,如果要對不同類型的資料進行計算,必須顯示類型轉換(強制類型轉換)

swift中整數預設類型為Int64 == long

小數預設類型為Double(OC中使用比較多的是CGFloat)

let dValue: Double = 
print(dValue)
           
let sum = Double(num) + dValue
print(sum)

let size = CGSize(width: , height: )
//Double和CGFloat 也需要轉換
let res = size.width + CGFloat(dValue)
print(res)

var dV: Double = 
var iV: Int
iV = Int(dV)

print("iV = " + String(iV))
print("dv = " + String(dV))
           

循環

循環Swift寫法

…閉區間, ..<半閉區間

0…10 / 0..<10 中間不能有空格

//  0~9之間
for i in .<
{
    print(i)
}

// 0~10
for i in .
{
    print(i)
}
           

忽略: _

不關心下标可以使用 _ 忽略下标

在swift中 _ 使用非常廣泛

for _ in . {
    print("for循環 - 忽略下标")
}
           

while 循環 沒有 ++ – 等操作 隻有 += -=

var n = 
while n <  {
    n += 
}
           

do while

var m = 
repeat {
    print(m)
    m += 
} while m < 
           

枚舉關聯值與值綁定模式

當枚舉中的關聯值和值綁定模式結合起來,就能夠達到從枚舉中取得關聯值的效果

enum Organism {
    case plant
    case animal(legs: Int)
}

let pet = Organism.animal(legs: )
let plant = Organism.plant
print(pet)
print(plant)

switch pet {
case .animal(let legs):
    print("\(legs) 條腿的動物")
default:
    print("植物")
}

//這段代碼中 animal的關聯值時一個叫legs的常量。
           

通配符模式(Wildcard Pattern)

通配符模式是由一個下劃線(_)構成,用于比對并忽略任何值。當你想忽略被比對的值時,可以使用該模式

例如,下面這段代碼在閉區間1…3中疊代,每次疊代都會忽略該區間目前的值

for _ in . {
//
}
           

辨別符模式(Identifier Pattern)

辨別符模式比對任何值,并将比對的值和一個變量或者常量綁定起來。例如,在下面的常量聲明中,someValue是一個辨別符模式,比對了Int類型的42

let someValue = 
           

當比對成功時,42被綁定(指派)給常量 someValue

如果一個變量或常量聲明的左邊是一個辨別符模式,那麼這個辨別符模式是值綁定的子模式

值綁定模式(Value-Binding Pattern)

值綁定模式把比對到的值綁定給一個變量或常量。把比對到的值綁定給常量時,用關鍵字 let,綁定給變量時,用關鍵字 var

在值綁定模式中的辨別符模式會把新命名的變量或常量與比對到的值做綁定。

例如,你可以拆開一個元組,然後把每個元素綁定到相應的辨別符模式中

switch pointTuples {
    //将pointTuples 中的元素綁定到 x 和 y
case let (x, y):
    print(" The pointTuples is at(\(x), \(y))")
default:
    print("其他")
}