Swift類型創立之自界說一個類型詳解。本站提示廣大學習愛好者:(Swift類型創立之自界說一個類型詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift類型創立之自界說一個類型詳解正文
小同伴們,Swift中的Bool類型有著異常主要的語法功效,並支持起了全部Swift系統中的邏輯斷定系統,經由老碼的研討和進修, Bool類型自己實際上是對基本Boolean類型封裝,小同伴們能夠咬著手指頭問老碼,怎樣一會Bool類型,一會Boolean類型,其差別在於,前者是基於列舉的組合類型,爾後者則是根本類型,只要兩種true和false。
####自界說原型
接下老碼依據Bool的思惟來創立一個OCBool類型,來讓小同伴們懂得一下Swift中究竟是怎樣玩兒的。
來我們先看一下OCBool的界說。
#####代碼示例以下:
enum OCBool{
case ocTrue
case ocFalse
}
#####留意:
代碼中第2行和第3行,可以歸並到一行寫,如蘋果官方Blog所寫的一樣
代碼中定名須要留意:OCBool是類型名,所以首字母必需年夜寫,而case中的ocTrue和ocFalse是小類型則須要首字母小寫。
####完成默許值
行,我們給了一個英俊的界說,不外依照傳統說話的經歷,Bool值默許情形下是假, 所以我們的OCBool也應當如斯,我們應用類型擴大技巧增長這個默許特征:
extension OCBool{
init(){
self =.ocFalse
}
}
#####留意:
●代碼中第1行:extension症結字,異常壯大,小同伴們可以經由過程此發明出很多好玩的器械,建議列位去Github上看一個名為“Swiftz”的項目,它將擴大用到了極致。
●代碼中第3行:self = .ocFalse語法,剛入門的小同伴們很含混,為何會有奇異的點語法,由於年夜牛Chris在Swift中增長了類型智能揣摸功效,在蘋果Blog中,提到了“Context”概念,就是這個意思,由於這行語句是在列舉OCBool中的,其高低文就是OCBool的界說體,編譯器固然曉得.ocFalse就是OCBool.ocFalse了,所以這裡直接點語法,異常整潔。
如今我們可使用以下辦法應用這個Bool類型。
#####代碼示例以下:
var result:OCBool = OCBool()
var result1:OCBool = .ocTrue
####支撐根本布爾型初始化
正如上述代碼所述,我們只能經由過程類型或許列舉項目賦值,這是組合類型的用法,然則編碼的日子裡,我們老是願望和true,false直接打交道,也就是說,我們願望這麼做,
代碼示例以下:
var isSuccess:OCBool = true
假如小同伴們直接這麼用,則會湧現以下毛病:
/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:30:24: Type 'OCBool' does not conform to protocol 'BooleanLiteralConvertible'
編譯器呼嘯的緣由是,我們的類型沒有服從“布爾字面量轉換協定”,接上去修改這個成績,
#####代碼示例以下:
import Foundation
println("Hello, World!")
enum OCBool{
case ocTrue
case ocFalse
}
extension OCBool: BooleanLiteralConvertible{
static func convertFromBooleanLiteral( value: Bool) ->OCBool{
return value ? ocTrue : ocFalse
}
}
var isSuccess:OCBool = true
#####留意:
代碼中的第11行是重點,我的類型OCBool支撐了BooleanLiteralConvertible協定,這個協究竟是干甚麼的呢,小同伴們在Xcode代碼編纂器,按住Command鍵,然後點擊第11行中的BooleanLiteralConvertible協定名,則會進入它的界說,
#####其界說以下:
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
這個界說中有個類辦法convertFromBooleanLiteral,它的參數為BooleanLiteralType類型,也就是我傳入的Bool類型, 且前往值為完成這個協定的類型自己,在我們的OCBool類型中,其前往值就是OCBool自己。經由這個界說,我們可以直接對OCBool類型直接停止布爾字面量初始化了。
####支撐Bool類型斷定
小同伴們不安本分, 確定想著我怎樣用它完成邏輯斷定,所以假如你這麼寫,
#####代碼示例以下:
var isSuccess:OCBool = true
if isSuccess {
println( "老碼請你吃暖鍋!")
}
你永久吃不到老碼的暖鍋,由於這裡編譯器會呼嘯:
/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:27:4: Type 'OCBool' does not conform to protocol 'LogicValue'
OCBool如今只能用bool類型初始化,而不克不及直接前往bool型,小火炬們還記得在《老碼說編程之白話Swift江湖》中,老碼屢次提到,媽媽不再擔憂我們 if a = 1{}的寫法了, 由於等號不支撐值前往了, 所以在if斷定是前面的前提必需有前往值,OCBool沒有,所以編譯器哭了。我們處理這個成績。
#####代碼示例以下:
import Foundation
println("Hello, World!")
enum OCBool{
case ocTrue
case ocFalse
}
extension OCBool: BooleanLiteralConvertible{
static func convertFromBooleanLiteral( value: Bool) ->OCBool{
return value ? ocTrue : ocFalse
}
}
extension OCBool: LogicValue{
func getLogicValue() ->Bool {
var boolValue: Bool{
switch self{
case .ocTrue:
return true
case .ocFalse:
return false
}
}
return boolValue
}
}
var isSuccess:OCBool = true
if isSuccess {
println( "老碼請你吃暖鍋!")
}
####運轉成果以下:
Hello, World!
老碼請你吃暖鍋!
Program ended with exit code: 0
#####留意:
●假如小同伴們如今用的是Beta版的Xcode,留意蘋果官方Blog中,在代碼第17行假如在Xcode Beta4下是毛病的,這裡的協定是,LogicValue而不是BooleanVue,所以記得看毛病提醒才是好習氣。
●留意代碼第34行,完善支撐if斷定,且輸入成果為“老碼請你吃暖鍋”,老碼也是說說罷了,請不要認真。
####支撐兼容各們各派的類型
小同伴們,江湖風險,門派浩瀚,老碼有本身的OCBool類型,能夠嵩山少林有本身的SSBool類型,乃至連郭美美都能夠有本身的MMBool類型,所以OCBool必需可以或許辨認這些類型,這些各門各派的類型,只需支撐LogicValue協定,就應當可以被辨認,看老碼怎樣做,
#####代碼示例以下:
extension OCBool{
init( _ v: LogicValue )
{
if v.getLogicValue(){
self = .ocTrue
}
else{
self = .ocFalse
}
}
}
var mmResult: Bool = true
var ocResult:OCBool = OCBool(mmResult)
if ocResult {
println( "老碼沒錢,郭美美請你吃暖鍋!")
}
#####代碼運轉成果以下:
Hello, World!
老碼沒錢,郭美美請你吃暖鍋!
Program ended with exit code: 0
英俊!我們的OCBool類型如今支撐了一切的邏輯變量初始化。
#####留意:
●代碼中第2行:“_”下橫槓的用法,這是一個功效壯大的小強,在此的目標是屏障內部參數名,所以小同伴們可以直接:var ocResult:OCBool = OCBool(mmResult)而不是:var ocResult:OCBool = OCBool(v: mmResult),小同伴們驚呆了!這個init函數中原來就沒有內部參數名啊,還記得老碼在書裡說過沒,Swift的初始化函數會默許應用外部參數名,作為內部參數名。
####完美OCBool的布爾基因系統:
小同伴們,bool類型的價值就是在於各類斷定,諸如==,!=, &,|,^,!,和各類組合邏輯運算,我們OCBool也要具有這些功效,不然就會基因缺點,且看老碼若何完成:
extension OCBool: Equatable{
}
//支撐等值斷定運算符
func ==( left: OCBool, right: OCBool )->Bool{
switch (left, right){
case (.ocTrue, .ocTrue):
return true
default:
return false
}
}
//支撐位與運算符
func &( left:OCBool, right: OCBool)->OCBool{
if left{
return right
}
else{
return false
}
}
//支撐位或運算符
func |( left:OCBool, right: OCBool)->OCBool{
if left{
return true
}
else{
return right
}
}
//支撐位異或運算符
func ^( left:OCBool, right: OCBool)->OCBool{
return OCBool( left != right )
}
//支撐求反運算符
@prefix func !( a:OCBool )-> OCBool{
return a ^ true
}
//支撐組合求與運算符
func &= (inout left:OCBool, right:OCBool ){
left = left & right
}
var isHasMoney:OCBool = true
var isHasWife:OCBool = true
var isHasHealty:OCBool = true
var isHasLover:OCBool = true
isHasMoney != isHasHealty
isHasHealty == isHasMoney
isHasWife ^ isHasLover
isHasWife = !isHasLover
if (isHasMoney | isHasHealty) & isHasHealty{
println( "人生贏家,就像老碼一樣!")
}else
{
println("人生最苦的事事,人逝世了錢沒花了,人生最苦的事是,人在世,錢沒了!")
}
好了,到這裡就到這裡了,窗外的雷聲喚醒了老碼,如今應當去吃飯了,以上老碼給年夜家展現了假如制作一個本身的類型,記得老碼的示例是在Xcode6 Beta4下測試的,至於Beta5的轉變還沒有觸及,小同伴們要好生演習,今後各類自定類型都是基於這個思惟。還有這個章節不是老碼的原創,老碼賣力的浏覽了蘋果的官方博客,且本身的演習總結,假如小同伴們費了吃奶的勁照樣看不懂,請找度娘谷歌♂♂♂