重庆时时彩组六单式 重庆时时彩犯法正规吗 重庆时时彩三码一胆 重庆时时彩平台手机版 山西福彩新时时彩 重庆时时彩走势dbshishicai88 重庆时时彩开奖视频怎么打不开了 如何破解重庆时时彩 360新时时彩删除 老时时彩20110601 重庆时时彩跨度介绍 重庆时时彩平台稳赚吗 360老时时彩怎么下注 新时时彩后2大小 重庆时时彩二星跨度走势图

轉載自泊學(boxueio.com)

這一節,我們結束對IUO的討論,來看下Swift 4.2中,我們還沒有提及的與IUO相關的修改。

對[T]!使用map方法

第一個場景,是對[T]!這種類型使用map方法:

let values: [Any]! = [C()] let transformed = values.map { $0 as! C }

在Swift 4.2之前的版本里,會先對values的值進行unwrap,得到一個[Any],然后再調用[Any]的map方法對數組中元素進行變換,即使你是否對ImplicitlyUnwrappedOptional這個類型擴展了map方法也是如此。

但到了4.2之后,就不是這樣了。values的類型已經變成了Optional<[Any]>,values.map調用的會是Optional<T>.map方法,因此這時的$0的類型就變成了[Any]。把[Any]強制轉型成C,總是失敗的,于是,我們會看到這樣一條編譯器警告:

其實這里,是有一個類型選擇問題的,究竟應該調用Array還是Optional的map方法呢?對于編譯器來說,如果可以不進行額外操作就讓{ $0 as! C }通過編譯,編譯器當然應該傾向于直接編譯。而恰好,{ $0 as! C }這樣的語法對于Optional來說是完全合法的。因此,編譯器當然傾向于什么都不做,直接進行編譯了。

但顯然,這樣做從語義上說,和我們理解的有些偏差,畢竟我們實際上是希望對Any進行類型轉換的。為此,我們有兩種處理方法:

第一種,是利用optional chaining,在values非nil的情況下調用map,此時就會調用Array的map方法了。這樣,我們會得到一個Optional<[C]>

let transformed = values?.map { $0 as! C }

第二種,當然就是簡單粗暴的直接把optional unwrap出來。這樣,我們就會冒著崩潰的風險,直接得到一個[C]:

let transformed = values!.map { $0 as! C }

看到這,你可能會隱隱有一個感覺。是不是我的代碼很多地方都存在類似的調用選擇問題需要修改啊?實際上,情況沒有你預感的這么復雜,絕大多數時候,我們無需關心上面這個變化。例如,對下面這個例子:

let intValues: [Int]! = [1] let transformedInts = intValues.map { $0 + 1 }

這次,為了讓{ $0 + 1 }編譯通過,編譯器別無選擇,只能把intValues的值解出來,然后對Int加1才行。因此,盡管intValues的類型是Optional<[Int]>。但是調用map仍舊會導致intValues的值被unwrap。

T! 不再能夠作為函數重載的憑據

了解了方法的適配方式時候,我們再來看函數參數類型的適配。在Swift 4.2中,如果你用T!和T?作為重載函數的依據,你會得到一個錯誤:redeclaratioin of 'fn'。例如:

func fn(_: Int?) {} func fn(_: Int!) {}

實際上,對于這種optional參數,本來,T!和T?類型就是通用的。例如,對于func fn(_: Int?) {}來說,下面兩種用法都是合法的:

var intIUO: Int! = 1 var intOptional: Int? = 1 fn(intIUO)
fn(intOptional)

既然如此,當然也就無需再做重載了。

nil值橋接方式的改變

最后一個要介紹的變化,和nil值有關。在Swift 4.2之前,Swift中的nil橋接到OC中,會導致運行時錯誤,進而導致程序崩潰。在4.2之后,橋接nil會得到NSNull對象。來看下面這個例子:

class A: NSObject {} let iuoElement: A! = nil let array: [Any] = [iuoElement as Any] let nsArray = array as NSArray let element = nsArray[0]

上面的代碼,在Swift 4.2之前,nsArray[0]會因為訪問了nil導致運行時錯誤。但在Swift 4.2之后,我們可以這樣:

if let value = element as? NSNull { print("Nil value")
} else { print("Non nil value")
}

返回
頂部
重庆时时彩平台投注图
重庆时时彩组六单式 重庆时时彩犯法正规吗 重庆时时彩三码一胆 重庆时时彩平台手机版 山西福彩新时时彩 重庆时时彩走势dbshishicai88 重庆时时彩开奖视频怎么打不开了 如何破解重庆时时彩 360新时时彩删除 老时时彩20110601 重庆时时彩跨度介绍 重庆时时彩平台稳赚吗 360老时时彩怎么下注 新时时彩后2大小 重庆时时彩二星跨度走势图
快乐12开奖走势手机版 一定牛广东十一选五走势图 街机电玩捕鱼游戏平台 依靠股票赚钱靠谱吗 老快3最大遗漏期数 做什么生意最赚钱 电动汽车充电站怎样赚钱 在镇上拉海鲜卖赚钱吗 网上打杭州麻将微信群