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

轉載自泊學(boxueio.com)

在Swift 4.2中,對之前一個一直以來比容易帶來困惑的類型:Implicitly Unwrapped Optional,也就是我們常說的IUO,做了一個調整(見:SE-0054)。讓它從一個獨立的類型,變成了Optional類型的一個修飾。簡單來說,就是這樣的。在之前的Swift版本里,對于下面的代碼:

var a: Int? var b: Int!

其中,a的類型是Optional,而b的類型則是ImplicitlyUnwrappedOptional。而在Swift 4.2中,a和b的類型,都變成了Optional,只不過,對b來說,編譯器會給它做一個標記,以便“在必要的時候”,自動unwrap它包含的值。也就是說,在4.2版本之后,無論是!還是?,代碼中都只有一個optional類型,就是Optional。

對我們來說,這個改動意味著什么呢?接下來我們就總結一些和源代碼兼容性相關的變化。

編譯器對T!的提示

遷移到Swift 4.2之后,第一類我們最常見到的變化,就是所有編譯器生成的信息中,之前包含T!的部分都會變成T?

盡管b的定義是Int!,但從編譯器給出的提示中,b實際的定義則是Int?。對于這類問題,絕大多數時候,我們都可以直接把T!變成T?解決。

和 T! 相關的類型轉換

接下來,由于T!已經不再是個獨立的類型,因此,所有對T!的轉型行為,都會被定義成過期操作:

可以看到,編譯器會提示我們as T!已經是一個過期的行為,會在未來的某個Swift版本中被刪除。按照SE-0045中的約束,T!變成了類型修飾之后,轉型到T!應該是不被允許的,所有轉型到optional的操作都應該明確使用as T?這樣的用法。這個warning只是一個過渡而已。

限制了T!使用的場景

實際上,上面這個轉型的限制,只是T!從類型變成類型修飾之后的某個具象的問題。在Swift 4.2里,任何一個把T!當作類型的用法,理論上都是不允許的。例如下面這兩個例子:

對于數組來說,我們只能定義Array,而不能定義“包含可以自動解值的Optional的數組”。類似的,對于sum來說,我們只能定義,接受兩個Optional為參數的函數,而不能定義接受兩個“可以自動解值的Optional”作為參數的函數。“自動解值”,只是optional的某種特性,而不是類型的一部分。

那么,究竟可以在哪些地方使用T!呢?簡單來說,就是把!當成類型修飾的地方。這聽起來有點兒像廢話,我們來看一些例子。

第一個,就是變量或者屬性的定義中,可以使用T!:

var b: Int! = 3 class C { var attr: Int! = 0 }

無論是b還是attr,我們知道它們的類型都是Optional,只不過它們包含的值可以被編譯器自動解出來而已。

第二個,是在函數的參數和返回值中,可以使用T!:

func sumFn(_ m: Int!, _ n: Int!) -> Int! { return m + n
}

這說明,sumFn接受兩個Optional參數,并返回一個Optional,只不過允許編譯器自動解出optional的值而已。看到這,你可能會想,為什么函數的定義中可以使用T!,但是typealias卻不行呢?

很簡單,對于sumFn來說,無論我們給它傳遞Int!還是Int?的參數,它的類型是明確的,都是(Int?, Int?) -> Int?。只不過,在sumFn的實現里,可以自動解出optional的值而已,這個性質不影響sumFn的類型。但是,對于之前的sum來說,假設它的定義是合法的,按照規則,它也會被編譯器處理成:typealias sum = (Int?, Int?) -> Int?。但這樣有意義么?我們的目的從字面上看本來是要定義一個支持參數和返回值都可以自動解值的函數。與其這樣費力不討好,還不如就不允許這樣的行為。

返回
頂部
重庆时时彩平台投注图
重庆时时彩组六单式 重庆时时彩犯法正规吗 重庆时时彩三码一胆 重庆时时彩平台手机版 山西福彩新时时彩 重庆时时彩走势dbshishicai88 重庆时时彩开奖视频怎么打不开了 如何破解重庆时时彩 360新时时彩删除 老时时彩20110601 重庆时时彩跨度介绍 重庆时时彩平台稳赚吗 360老时时彩怎么下注 新时时彩后2大小 重庆时时彩二星跨度走势图
做微商就靠招代理赚钱 捕鱼来了外挂 英雄杀斗魂 派派答题赚钱软件下载 山东时时彩怎么中奖号码 qq麻将下载 快乐飞艇开奖官网 浙江省福利彩票官方网站 沛县养鸭赚钱吗