1、Swift 的nil和 Objective-C 中的nil區(qū)別
Swift 的nil和 Objective-C 中的nil并不一樣业栅。在 Objective-C 中,nil是一個(gè)指向不存在對(duì)象的指針螟左。在 Swift 中谈飒,nil不是指針——它是一個(gè)確定的值,用來表示值缺失肪凛。任何類型的可選都可以被設(shè)置為nil堰汉,不只是對(duì)象類型。
2伟墙、var optionalString: String? = "Hello"語句的理解
var optionalString: String? = "Hello
?表示變量optionalString可能有值翘鸭,也可能為nil,即值可能丟失戳葵。相當(dāng)于if和let一起使用判斷string是否為空
3就乓、對(duì)于2的補(bǔ)充,倘若?修飾的變量optionalString值為nil時(shí),你在訪問使用就會(huì)閃退生蚁。如下代碼會(huì)閃退
var optionalName: String? = nil
print("hello!" + optionalName)
方法一:改為下面的寫法
print("hello, \(optionalName)")
方法二:為避免上述錯(cuò)誤我們可以給optionalName變量一個(gè)默認(rèn)值噩翠。示例如下:
var optionalName: String? = nil
let defaultName: String = "James"
print("hello! \(optionalName ?? defaultName)")
備注:防止字符串為空是,可用 ?? 給字符串添加默認(rèn)值邦投。
4绎秒、static與class的區(qū)別
class 關(guān)鍵字專門用在 class 類型的上下文中的,可以用來修飾類方法以及類的計(jì)算屬性(注意:不能用在存儲(chǔ)類屬性上)尼摹。
在方法的func關(guān)鍵字之前加上關(guān)鍵字static或者class都可以用于指定類方法见芹。不同的是用class關(guān)鍵字指定的類方法可以被子類重寫,但是用static關(guān)鍵字指定的類方法是不能被子類重寫的蠢涝。
static 可以在類玄呛、結(jié)構(gòu)體、或者枚舉中使用和二。而 class 只能在類中使用徘铝。
static 可以修飾存儲(chǔ)屬性,static 修飾的存儲(chǔ)屬性稱為靜態(tài)變量(常量)惯吕。而 class 不能修飾存儲(chǔ)屬性惕它。
static 修飾的計(jì)算屬性不能被重寫。而 class 修飾的可以被重寫废登。
static 修飾的靜態(tài)方法不能被重寫淹魄。而 class 修飾的類方法可以被重寫。
class 修飾的計(jì)算屬性被重寫時(shí)堡距,可以使用 static 讓其變?yōu)殪o態(tài)屬性甲锡。
class 修飾的類方法被重寫時(shí),可以使用 static 讓方法變?yōu)殪o態(tài)方法羽戒。
5缤沦、可選的類型使用?和易稠!的理解
設(shè)置可選類型是(String?)表示可選缸废,(String!)表示隱式解析可選。
如果一個(gè)變量之后可能變成nil的話請(qǐng)不要使用隱式解析可選驶社。如果你需要在變量的生命周期中判斷是否是nil的話企量,請(qǐng)使用普通可選類型。如果你在隱式解析可選沒有值的時(shí)候嘗試取值衬吆,會(huì)觸發(fā)運(yùn)行時(shí)錯(cuò)誤梁钾。和你在沒有值的普通可選后面加一個(gè)驚嘆號(hào)一樣。
逊抡?就表面你可以允許你參數(shù)賦值為nil姆泻。這個(gè)時(shí)候在使用該參數(shù)用于賦值等操作的時(shí)候必須加上零酪!或者是加入官方說明的if判斷
func testStr(){
var str:String? = "hello"
//var result = str + "world"http://編譯錯(cuò)誤,這個(gè)地方必須要加上拇勃!因?yàn)閟tr可能是nil四苇,如果nil的話下面的語句是不通的
var result = str! + "world"http://如果要使用str,要加入方咆!月腋,確保編譯通過
str = nil
//result = str! + "world" //運(yùn)行錯(cuò)誤,因?yàn)?表示該參數(shù)可能為nil瓣赂,這個(gè)時(shí)候榆骚,程序是可以進(jìn)行賦值為nil操作的,所以在做操作的時(shí)候煌集,需要做判斷處理
if let isnull=str{
println("str is not null")
}else{
println("str is null")
}
}
妓肢!表示你定義的參數(shù)是不為null的。這個(gè)時(shí)候苫纤,雖然可以進(jìn)行賦值為nil的操作碉钠,但是一旦你進(jìn)行了賦值nil操作是編譯不過的
func testStr(){
var str:String! = "hello"
var result = str + "world"http://沒有問題,這個(gè)地方因?yàn)槎x的是卷拘!喊废,所以str肯定不為空,改語句成立
str = nil
result = str + "world"http://編譯通過栗弟,但是運(yùn)行時(shí)出錯(cuò)
result = str! + "world"http://編譯通過污筷,但是運(yùn)行時(shí)出錯(cuò)。
if let isnull=str{
println("str is not null")
}else{
println("str is null")
}
}
横腿?的使用情況
1.聲明Optional值變量
2.用在對(duì)Optional值操作中颓屑,用來判斷是否能相應(yīng)后面的操作
斤寂!的使用情況:
1.強(qiáng)制對(duì)Optional值進(jìn)行拆包(unwrap)
2.聲明Implicitly Unwrapped Optionals值耿焊,一般用于類中的屬性
6、for循環(huán)遍歷數(shù)組
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
print(teamScore)
7遍搞、方法名中的->是參數(shù)和返回值類型的“分水嶺”罗侯,->前面括號(hào)中是參數(shù)、->后面是返回值類型溪猿。如下示例:
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
8钩杰、方法參數(shù)標(biāo)簽前添加_ 或自定義標(biāo)簽:在調(diào)用的時(shí)候該參數(shù)標(biāo)簽不顯示。如:
//方法定義實(shí)現(xiàn)
func greet(_ person: String, on day: String) -> String {
return "Hello \(person), today is \(day)."
}
//方法調(diào)用
greet("John", on: "Wednesday")