Swift Tips:三寥闪、Swift開(kāi)發(fā)環(huán)境

Swift命令行工具

終端上可以使用Swift的REPL(Real-Eval-Print Loog)環(huán)境,輸入一句語(yǔ)句就立即執(zhí)行和輸出。
xcrun swift可以啟動(dòng)它:

// Terminal
xcrun swift

然后就可以愉快地做一點(diǎn)小嘗試昌罩,直接寫swift代碼,它會(huì)編譯再運(yùn)行:

print("hello")
// hello

swiftc可以脫離Xcode直接編譯Swift文件灾馒,生成可執(zhí)行文件茎用,比如有兩個(gè)Swift文件:

// MyClass.swift
class MyClass {
    let name = "XiaoMing"
    func hello() {
        print("Hello \(name)")
    }
}
// main.swift
let object = MyClass()
object.hello()

這時(shí)可以編譯它們:

swiftc MyClass.swift main.swift

將在當(dāng)前目錄下生成一個(gè)叫main的可執(zhí)行文件。
以后就可以用這個(gè)方法寫一些命令行程序了~

print 和 debugPrint

通過(guò)遵守CustomStringConvertible協(xié)議睬罗,可以改變print的輸出轨功。
debugPrint對(duì)應(yīng)的是CustomDebugStringConvertible

錯(cuò)誤和異常處理

錯(cuò)誤(error)和異常(exception)是有區(qū)別的容达。
在預(yù)想之外古涧,不應(yīng)該發(fā)生的叫異常,比如程序員寫錯(cuò)了代碼花盐。它應(yīng)該在開(kāi)發(fā)階段就被解決羡滑。
而在預(yù)想之內(nèi),合理存在的可能問(wèn)題算芯,叫錯(cuò)誤柒昏。它是開(kāi)發(fā)階段不能保證的。比如網(wǎng)絡(luò)請(qǐng)求出錯(cuò)熙揍、寫文件失敗职祷。
如果一個(gè)方法可能發(fā)生錯(cuò)誤,則可以在其聲明時(shí)添加throws關(guān)鍵字,然后在實(shí)現(xiàn)時(shí)發(fā)生錯(cuò)誤后拋出錯(cuò)誤對(duì)象堪旧,如NSDatawrite方法:

func write(toFile path: String, options writeOptionsMask: NSData.WritingOptions = []) throws

在調(diào)用帶有throws的方法時(shí)削葱,需要加try關(guān)鍵字,然后放在do塊里淳梦,并catch"異常":

let data = NSData()
do {
    try data.write(toFile: "Hello", options: [])
} catch let error {
    print(error.localizedDescription)
}

如果不想理會(huì)錯(cuò)誤信息析砸,也可以不寫do-catch,而使用下面2個(gè)辦法:

  • try!表示強(qiáng)制執(zhí)行爆袍,代表了你確定知道這次調(diào)用不會(huì)拋出異常首繁,如果一旦出現(xiàn)異常,程序?qū)?huì)崩潰陨囊。
  • try?會(huì)返回一個(gè)Optional值弦疮,如果成功,它會(huì)包含這條語(yǔ)句的返回值蜘醋,否則它是nil胁塞。

對(duì)于同步執(zhí)行的代碼,使用拋異常的方式?jīng)]什么問(wèn)題压语。但是對(duì)于異步API啸罢,拋出異常是不可用的。這時(shí)可以使用泛型枚舉胎食,封裝成錯(cuò)誤對(duì)象來(lái)返回:

enum Result<T> {
    case success(T)
    case failure(Error)
}

斷言

Swift提供了assert方法出使用斷言扰才,比如:

assert(false, "斷言失敗")
assertionFailure("直接引發(fā)運(yùn)行時(shí)錯(cuò)誤")

默認(rèn)情況下,斷言只在Debug編譯的時(shí)候有效厕怜,在Release是不會(huì)執(zhí)行的衩匣,所以它不會(huì)消耗程序發(fā)布后的運(yùn)行時(shí)性能。
當(dāng)然你也可以強(qiáng)制指定斷言的啟動(dòng)或禁用粥航,無(wú)視當(dāng)前是Debug還是Release:

// Build Settings 
// Swift Compiler - Custom Flags
// Other Siwft Falgs

// 強(qiáng)制啟動(dòng)
-assert-config Debug
// 強(qiáng)制禁用
-assert-config Release

斷言失敗可以令程序崩潰退出琅捏,但如果你真的想讓它退出,應(yīng)該選擇fatalError递雀。

fatalError

對(duì)于我們不希望別人隨意調(diào)用柄延,但是又不得不去實(shí)現(xiàn)的方法,應(yīng)該使用fatalError來(lái)避免可能的誤會(huì)映之。比如

required init(coder: NSCoder) {
    fatalError("NSCoding not supported")
}

以及一些抽象用的父類方法,也可以使用fatalError蜡坊,要求子類必須實(shí)現(xiàn)杠输,而不得直接調(diào)用父類方法。

log輸出

編譯器內(nèi)置了幾個(gè)符號(hào)秕衙,可以直接輸出一些信息:

// 文件
print(#file)
// 當(dāng)前行
print(#line)
// 當(dāng)前列
print(#column)
// 當(dāng)前方法名
print(#function)

泛型擴(kuò)展

對(duì)一個(gè)類聲明泛型之后蠢甲,其泛型標(biāo)記可以直接作用到擴(kuò)展中:

class MyClsaa<XX> {
    
}

extension MyClsaa {
    func printXX(_ x: XX) {
        print("\(x)")
    }
}

泛型標(biāo)記XX在擴(kuò)展中被直接使用了。
擴(kuò)展不能再定義作用于整個(gè)類的泛型据忘,但是可以定義某個(gè)方法使用的泛型:

extension MyClsaa {
    func echo<T>(_ obj: T) {
        print("echo:\(obj)")
    }
}

測(cè)試:

let cls = MyClsaa<String>()
cls.printXX("hello")
cls.echo(333)
// hello
// echo:333
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹦牛,一起剝皮案震驚了整個(gè)濱河市搞糕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌曼追,老刑警劉巖窍仰,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異礼殊,居然都是意外死亡驹吮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門晶伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碟狞,“玉大人,你說(shuō)我怎么就攤上這事婚陪∽逦郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵泌参,是天一觀的道長(zhǎng)脆淹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)及舍,這世上最難降的妖魔是什么未辆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮锯玛,結(jié)果婚禮上咐柜,老公的妹妹穿的比我還像新娘。我一直安慰自己攘残,他們只是感情好拙友,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著歼郭,像睡著了一般遗契。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上病曾,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天牍蜂,我揣著相機(jī)與錄音,去河邊找鬼泰涂。 笑死鲫竞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逼蒙。 我是一名探鬼主播从绘,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了僵井?” 一聲冷哼從身側(cè)響起陕截,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎批什,沒(méi)想到半個(gè)月后农曲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渊季,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年朋蔫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片却汉。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驯妄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出合砂,到底是詐尸還是另有隱情青扔,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布翩伪,位于F島的核電站微猖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缘屹。R本人自食惡果不足惜凛剥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轻姿。 院中可真熱鬧犁珠,春花似錦、人聲如沸互亮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豹休。三九已至炊昆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間威根,已是汗流浹背凤巨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洛搀,地道東北人敢茁。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像姥卢,于是被迫代替她去往敵國(guó)和親卷要。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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