iOS開發(fā)之Swift學(xué)習(xí)(二)

文章目錄:
(1)對(duì)象和類
(2)枚舉和結(jié)構(gòu)體
(3)協(xié)議和擴(kuò)展
(4)泛型

(1)對(duì)象和類

  1. 要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,在類名后面加上括號(hào)。使用點(diǎn)語法來訪問實(shí)例的屬性和方法。
class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
  1. 構(gòu)造函數(shù)來初始化類實(shí)例。使用 init 來創(chuàng)建一個(gè)構(gòu)造器。

  2. 如果你需要在刪除對(duì)象之前進(jìn)行一些清理工作,使用 deinit 創(chuàng)建一個(gè)析構(gòu)函數(shù)。

  3. 子類的定義方法是在它們的類名后面加上父類的名字,用冒號(hào)分割。創(chuàng)建類的時(shí)候并不需要一個(gè)標(biāo)準(zhǔn)的根類,所以你可以忽略父類。

  4. 子類如果要重寫父類的方法的話,需要用 override 標(biāo)記——如果沒有添加 override 就重寫父類方法的話編譯器 會(huì)報(bào)錯(cuò)。編譯器同樣會(huì)檢測 override 標(biāo)記的方法是否確實(shí)在父類中。

  5. 處理變量的可選值時(shí),可以在操作(比如方法、屬性和子腳本)之前加 ? 。如果 ? 之前的值是 nil , ? 后面 的東西都會(huì)被忽略,并且整個(gè)表達(dá)式返回 nil 。否則, ? 之后的東西都會(huì)被運(yùn)行。在這兩種情況下,整個(gè)表達(dá)式 的值也是一個(gè)可選值。

(2)枚舉和結(jié)構(gòu)體

  1. 使用 enum 來創(chuàng)建一個(gè)枚舉。和其他所有命名類型一樣,枚舉可以包含方法。
  2. 一個(gè)枚舉成員的實(shí)例可以有實(shí)例值。相同枚舉成員的實(shí)例可以有不同的值。創(chuàng)建實(shí)例的時(shí)候傳入值即可。實(shí)例值和原始值是不同的:枚舉成員的原始值對(duì)于所有實(shí)例都是相同的,而且在定義枚舉的時(shí)候設(shè)置原始值。
 enum ServerResponse {
     case Result(String, String)
     case Failure(String)
}
 let success = ServerResponse.Result("6:00 am", "8:09 pm")
 let failure = ServerResponse.Failure("Out of cheese.")
 switch success {
 case let .Result(sunrise, sunset):
     let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
 case let .Failure(message):
     print("Failure...  \(message)")
 }
  1. 使用 struct 來創(chuàng)建一個(gè)結(jié)構(gòu)體。結(jié)構(gòu)體和類有很多相同的地方,比如方法和構(gòu)造器。它們之間最大的一個(gè)區(qū)別就 是結(jié)構(gòu)體是傳值,類是傳引用。
struct Card {
     var rank: Rank
     var suit: Suit
     func simpleDescription() -> String {
          return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
} }
 let threeOfSpades = Card(rank: .Three, suit: .Spades)
 let threeOfSpadesDescription = threeOfSpades.simpleDescription()

(3)協(xié)議和擴(kuò)展

  1. 使用 protocol 來聲明一個(gè)協(xié)議。
protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}
  1. 類、枚舉和結(jié)構(gòu)體都可以實(shí)現(xiàn)協(xié)議。
class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    func adjust() {
        simpleDescription += "  Now 100% adjusted."
    }
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    mutating func adjust() {
        simpleDescription += " (adjusted)"
    }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

注意: 聲明 SimpleStructure 時(shí)候 mutating 關(guān)鍵字用來標(biāo)記一個(gè)會(huì)修改結(jié)構(gòu)體的方法。 SimpleClass 的聲明不需要 標(biāo)記任何方法,因?yàn)轭愔械姆椒ㄍǔ?梢孕薷念悓傩?類的性質(zhì))。

  1. 使用 extension 來為現(xiàn)有的類型添加功能,比如新的方法和計(jì)算屬性。你可以使用擴(kuò)展在別處修改定義,甚至是 從外部庫或者框架引入的一個(gè)類型,使得這個(gè)類型遵循某個(gè)協(xié)議。
extension Int: ExampleProtocol {
    var simpleDescription: String {
        return "The number \(self)"
    }
    mutating func adjust() {
self += 42 }
}
 print(7.simpleDescription)

可以像使用其他命名類型一樣使用協(xié)議名——例如,創(chuàng)建一個(gè)有不同類型但是都實(shí)現(xiàn)一個(gè)協(xié)議的對(duì)象 合。當(dāng)處理類型是協(xié)議的值時(shí),協(xié)議外定義的方法不可用。

let protocolValue: ExampleProtocol = a print(protocolValue.simpleDescription)
// print(protocolValue.anotherProperty) // 去掉注釋可以看到錯(cuò)誤

即使 protocolValue 變量運(yùn)行時(shí)的類型是 simpleClass ,編譯器會(huì)把它的類型當(dāng)做 ExampleProtocol 。這表示你不能調(diào)用類在它實(shí)現(xiàn)的協(xié)議之外實(shí)現(xiàn)的方法或者屬性。

(4)泛型

  1. 在尖括號(hào)里寫一個(gè)名字來創(chuàng)建一個(gè)泛型函數(shù)或者類型。
func repeatItem<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
    var result = [Item]()
    for _ in 0..<numberOfTimes {
        result.append(item)
    }
    return result
}
repeatItem(repeating: "knock", numberOfTimes:4)
  1. 我們也可以創(chuàng)建泛型函數(shù)、方法、類、枚舉和結(jié)構(gòu)體。
// 重新實(shí)現(xiàn) Swift 標(biāo)準(zhǔn)庫中的可選類型 enum OptionalValue<Wrapped> {
case None
     case Some(Wrapped)
 }
 var possibleInteger: OptionalValue<Int> = .None
 possibleInteger = .Some(100)
  1. 在類型名后面使用 where 來指定對(duì)類型的需求,比如,限定類型實(shí)現(xiàn)某一個(gè)協(xié)議,限定兩個(gè)類型是相同的,或者 限定某個(gè)類必須有一個(gè)特定的父類。
func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
     where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
         for lhsItem in lhs {
             for rhsItem in rhs {
                 if lhsItem == rhsItem {
                     return true
} }
         }
         return false
 }
 anyCommonElements([1, 2, 3], [3])
<T: Equatable> 和 <T> ... where T: Equatable> 是等價(jià)的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,337評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,114評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評(píng)論 1 332
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,555評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,737評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,973評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評(píng)論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,343評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,699評(píng)論 2 370

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