swift 初學(xué)

Swift是強(qiáng)類型語言睁搭,但也允許開發(fā)者通過is、as笼平?和as园骆!這三種操作來對(duì)類型進(jìn)行判斷和強(qiáng)制轉(zhuǎn)換。其中is用作類型判斷寓调,而as锌唾?和as!則分別是類型轉(zhuǎn)換的可選形式和強(qiáng)制形式夺英。在這里強(qiáng)調(diào)一下晌涕,swift中比較常用的向下轉(zhuǎn)換(downcast)是沒有as操作符的。

is操作符

is操作用來判斷某一個(gè)對(duì)象是否是某一個(gè)特定的類痛悯,它會(huì)返回一個(gè)bool類型的值余黎。is操作的邏輯很簡單,某一個(gè)類的對(duì)象肯定是自己這個(gè)類载萌,也一定是自己的超類惧财,但超類的對(duì)象不是子類。如果兩個(gè)類沒有繼承關(guān)系扭仁,那is操作一定返回false.

as垮衷!操作符

as!操作符是類型轉(zhuǎn)換的強(qiáng)制格式乖坠,優(yōu)點(diǎn)在于代碼簡單搀突,如果可以轉(zhuǎn)換,則會(huì)返回轉(zhuǎn)換了格式的對(duì)象熊泵,如果無法轉(zhuǎn)換就會(huì)拋出運(yùn)行時(shí)錯(cuò)誤仰迁。因此除非百分之百確定可以轉(zhuǎn)換,否則不應(yīng)該使用as顽分!來進(jìn)行強(qiáng)制類型轉(zhuǎn)換轩勘。

as?和as怯邪!操作符的轉(zhuǎn)換規(guī)則完全一樣绊寻,但是as?會(huì)返回一個(gè)被轉(zhuǎn)換類型的可選類型,需要我們解封澄步。因此寫法會(huì)略有不同冰蘑,

Swift—使用try?和try!區(qū)別
**1.使用try? **
try?會(huì)將錯(cuò)誤轉(zhuǎn)換為可選值,當(dāng)調(diào)用try?+函數(shù)或方法語句時(shí)候村缸,如果函數(shù)或方法拋出錯(cuò)誤祠肥,程序不會(huì)發(fā)崩潰,而返回一個(gè)nil梯皿,如果沒有拋出錯(cuò)誤則返回可選值仇箱。

2.使用****try!
使用try!可以打破錯(cuò)誤傳播鏈條。錯(cuò)誤拋出后傳播給它的調(diào)用者东羹,這樣就形成了一個(gè)傳播鏈條剂桥,但有的時(shí)候確實(shí)不想讓錯(cuò)誤傳播下去,可以使用try!語句属提。

AnyObject是一定不能為空权逗,包括初始化的時(shí)候
AnyObject!表示類型是一個(gè)optional類型冤议,初始化的時(shí)候可以為空斟薇,但是加!表示知道用它時(shí)它是一定不為空的

Swift 語言中 類型后面的 恕酸?和 堪滨! 有什么作用?
! 并不代表一定有值. 在定義一個(gè)屬性的時(shí)候使用 ! , 那么你在取值或賦值的時(shí)候就不需要手動(dòng)強(qiáng)制解包了.但是如果定義的時(shí)候?qū)?, 在賦值/取值的時(shí)候就需要自己解包

Swift語言使用var定義變量蕊温,但和別的語言不同袱箱,Swift里不會(huì)自動(dòng)給變量賦初始值,
也就是說變量不會(huì)有默認(rèn)值寿弱,所以要求使用變量之前必須要對(duì)其初始化
犯眠。如果在使用變量之前不進(jìn)行初始化就會(huì)報(bào)錯(cuò):

var stringValue : String   
//error: variable 'stringValue' used before being initialized  
//let hashValue = stringValue.hashValue  
//                            ^  
let hashValue = stringValue.hashValue 

出錯(cuò)的原因就是在使用stringValue這個(gè)變量之前按灶,沒有初始化這個(gè)變量症革,也就是這個(gè)變量根本就沒有得到內(nèi)存,
這時(shí)就會(huì)出錯(cuò)鸯旁。
那么我們可以使用optional類型噪矛,后面跟一個(gè)?就是了铺罢。

// 這就是optional, strValue自動(dòng)得到默認(rèn)值:nil   
// 這個(gè)nil跟Objective-C中的nil不同艇挨,不是指針,而是表示值不存在韭赘。  
var strValue: String?   
  
// 判斷optional是否有值  
if strValue {  
 // do what you need to do here  
}  

文檔中有提到說缩滨,在使用Optional值的時(shí)候需要在具體的操作,比如調(diào)用方法、屬性脉漏、下標(biāo)索引等前面需要加上一個(gè)苞冯?,如果是nil值(不存在值)侧巨,也就是Optional.None舅锄,會(huì)跳過后面的操作不執(zhí)行,如果有值司忱,就是Optional.Some可能就會(huì)拆包(unwrap)皇忿,然后對(duì)拆包后的值執(zhí)行后面的操作,來保證執(zhí)行這個(gè)操作的安全性坦仍,比如Optional binding:

// optional binding  
// 如果strValue == nil, 那么結(jié)果就是nil,不會(huì)調(diào)用String的hasValue  
// 如果strValue != nil, 就返回strValue對(duì)應(yīng)的hashValue值并賦值給常量hashValue  
if let hashValue = strValue?.hashValue {  
  // do something if neccessary  
} 

在寫協(xié)議(protocol)時(shí)鳍烁,對(duì)于可選代理方法,也需要在調(diào)用時(shí)在函數(shù)名后跟著桨踪?,如:

// @objc 是用于處理Swift與OC之間的轉(zhuǎn)換的老翘,由于@optional是OC中的關(guān)鍵字,  
// 所以在protocol之前需要添加上@objc锻离。  
@objc protocol HttpRequestDelegate {  
  // @optional 說明這個(gè)代理方法是可選方法铺峭,  
  // 那么在調(diào)用的時(shí)候,需要這樣調(diào)用:delegate?.requestFinished?(self, downloadData)  
  // 其中delegate?是因?yàn)閐elegate也是optional的  
  @optional func requestFinished(request: HttpRequest!, downloadData: NSMutableData!)  
    
  // other funcs ...  
}  
  
var delegate: HttpRequestDelegate?  
var downloadData = NSMutableData()  
delegate.requestFinished(self, downloadData)  

當(dāng)然我們也可以使用汽纠!來強(qiáng)制拆包卫键,這是我們?cè)诒WC有值的情況下才會(huì)這么用:

var strValue: String?  
strValue = "1234"  
  
let integer = strValue!.toInt()  
// 更安全的寫法是  
if strValue {  
  let integer = strValue!.toInt()  
}

隱式強(qiáng)拆包類型:使用!來聲明變量虱朵,會(huì)成為隱式強(qiáng)拆包可選類型莉炉,這表示這個(gè)類型永遠(yuǎn)不會(huì)出現(xiàn)nil的情況,但一旦出來碴犬,
在調(diào)用時(shí)就會(huì)崩潰絮宁。

// Implicitly Unwrapped Optionals  
// 使用這種方式聲明的話,在調(diào)用時(shí)不需要使用?或服协!來說明绍昂。  
var myLabel: UILabel!   
  
myLabel = UILabel(frame: CGRectMake(10, 100, 300, 10))  
myLabel.text = "label" 

總結(jié):
通常在什么情況下才會(huì)使用optional類型呢?
(1)當(dāng)我們需要聲明這樣一個(gè)變量偿荷,變量在設(shè)計(jì)初始化函數(shù)中沒有進(jìn)行初始化時(shí)窘游,就需要聲明這個(gè)變量為optional類型。因?yàn)樽兞吭谑褂们氨仨毾?br> 聲明跳纳,并且在設(shè)計(jì)初始化函數(shù)中進(jìn)行初始化忍饰。比如我們?cè)趘iewDidLoad函數(shù)中才進(jìn)行初始化的控件(類成員),就需要聲明為optional且必須是var聲明寺庄,
因?yàn)閘et聲明的常量只能是在初始化函數(shù)中進(jìn)行初始化艾蓝。
(2)當(dāng)我們不知道是否會(huì)有值的時(shí)候力崇,這個(gè)變量可以聲明為optional,比如代理,我們并沒有要求必須傳代理過來赢织,那么就需要聲明為optional餐曹。
(3)作為函數(shù)參數(shù)時(shí),如果這個(gè)參數(shù)可以沒有值敌厘,那么就使用optional類型台猴,比如傳代理的時(shí)候,通常就是可選的俱两,可以設(shè)置為nil

var evalList = [Evakmodel]()   //數(shù)組
var vrstore = Storemodel()     //函數(shù)
var web view = UIWebView()  //初始化方法
var topbtn:UIImafeView!     //解包

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饱狂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宪彩,更是在濱河造成了極大的恐慌休讳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尿孔,死亡現(xiàn)場(chǎng)離奇詭異俊柔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)活合,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門雏婶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人白指,你說我怎么就攤上這事留晚。” “怎么了告嘲?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵错维,是天一觀的道長。 經(jīng)常有香客問我橄唬,道長赋焕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任仰楚,我火速辦了婚禮隆判,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缸血。我一直安慰自己蜜氨,他們只是感情好械筛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布捎泻。 她就那樣靜靜地躺著,像睡著了一般埋哟。 火紅的嫁衣襯著肌膚如雪笆豁。 梳的紋絲不亂的頭發(fā)上郎汪,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音闯狱,去河邊找鬼煞赢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哄孤,可吹牛的內(nèi)容都是我干的照筑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼瘦陈,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼凝危!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晨逝,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蛾默,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捉貌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體支鸡,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年趁窃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牧挣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡醒陆,死狀恐怖浸踩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情统求,我是刑警寧澤检碗,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站码邻,受9級(jí)特大地震影響折剃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜像屋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一怕犁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧己莺,春花似錦奏甫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胜蛉,卻和暖如春挠进,著一層夾襖步出監(jiān)牢的瞬間色乾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工领突, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暖璧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓君旦,卻偏偏與公主長得像澎办,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子金砍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理浮驳,服務(wù)發(fā)現(xiàn),斷路器捞魁,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 簡介 這是一個(gè)Swift語言教程至会,基于最新的iOS 9,Xcode 7.3和Swift 2.2谱俭,會(huì)為你介紹Swif...
    張嘉夫閱讀 3,207評(píng)論 0 50
  • 基礎(chǔ)部分(The Basics) 當(dāng)推斷浮點(diǎn)數(shù)的類型時(shí)奉件,Swift 總是會(huì)選擇Double而不是Float。 結(jié)合...
    gamper閱讀 1,275評(píng)論 0 7
  • 132.轉(zhuǎn)換錯(cuò)誤成可選值 通過轉(zhuǎn)換錯(cuò)誤成一個(gè)可選值,你可以使用 try? 來處理錯(cuò)誤昆著。當(dāng)執(zhí)行try?表達(dá)式時(shí),如果...
    無灃閱讀 1,244評(píng)論 0 3
  • 今天就是大年初一啦县貌,新年新氣象,我突然覺得該好好規(guī)劃一下凑懂。日子一天天過的飛快煤痕,最近幾年都沒有啥進(jìn)步,天天懶散的有點(diǎn)...
    快樂一家親閱讀 404評(píng)論 0 0