馬上著手開發(fā) iOS 應用程序 (二) - 學習必要的 Swift 知識

重要:這是針對于正在開發(fā)中的API或技術的預備文檔(預發(fā)布版本)渡八。蘋果提供這份文檔的目的是幫助你按照文中描述的方式對技術的選擇及界面的設計開發(fā)進行規(guī)劃萨醒。這些信息有可能發(fā)生變化昔脯,因此根據(jù)本文檔的軟件開發(fā)應當基于最終版本的操作系統(tǒng)和文檔進行測試。該文檔的新版本或許會隨著API或相關技術未來的發(fā)展而進行更新港令。

翻譯自蘋果官網(wǎng):

https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/index.html#//apple_ref/doc/uid/TP40015214-CH2-SW1

第一課以 Swift Playground 形式展現(xiàn)的焰望,它是種能讓你與代碼進行交互并實時看到結果的文件。Playgrounds 對于學習和嘗試非常棒曲秉,它幫助你提高學習基礎 Swift 概念的效率采蚀。

注意

最佳實踐是在 Xcode 中打開此課時的 Playground。

下載 Playground

學習目標

在課時結束時承二,你將學到:

  • 常量和變量之間的區(qū)別
  • 知道何時使用隱式和顯式類型聲明
  • 理解使用可選和可選綁定的優(yōu)點
  • 區(qū)分可選和隱式展開可選
  • 理解條件語句和循環(huán)的作用
  • 為條件分支超過一個的判斷使用 Switch 語句
  • 在條件語句中使用 where 從句增加額外的判斷約束
  • 區(qū)分 functions(函數(shù))榆鼠,methods(方法)initializers(構造方法)
  • 區(qū)分 classes(類)structures(結構體)亥鸠,enumerations(枚舉)
  • 理解繼承和協(xié)議一致性
  • 確定隱式類型和使用 Xcode 快捷幫助找到更多的信息(Option-單擊)
  • 導入和使用 UIKit

基本類型

常量的值在第一次定義后會保持不變妆够,而變量值會改變。常量被稱為不可變读虏,意味著它不可以被修改责静。如果你知道代碼中的值不需要改變,把它定義為常量而不是變量盖桥。

var myVariable = 42
myVariable = 50
let myConstant = 42

Swift 每個常量和變量都有一個類型灾螃,但是你經(jīng)常不需要明確聲明類型,在賦值后揩徊,編譯器會自動推斷類型腰鬼。在上面的例子中嵌赠,編譯器推斷出 myVariable 是 Int 類型因為它的初始值是整數(shù)。這被稱為類型推斷熄赡。一旦常量或者變量有了類型姜挺,這個類型就不能再改變了。

let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
重要提示:

Xcode 中彼硫,按住 Option 并點擊常量或變量的名字來查看它的推斷類型炊豪。嘗試對上面代碼的常量這么做。

Swift 的值永遠不會被隱式轉換為其他類型拧篮。如果你需要把一個值轉換成其他類型词渤,請顯式轉換成想要的類型的實例。這里串绩,你轉換一個 Int 的值為 String 類型缺虐。

let label = "The width is"
let width = 94
let widthLabel = label + String(width)
練習:
刪除最后一行中的 String 轉換,看得到什么錯誤提示礁凡?

有種很簡單的方式向字符串中插入各種類型的值:使用小括號把值括起來高氮,然后在括號前加個反斜杠 \ 。這被稱為字符串插值顷牌。

let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

使用可選來處理值可能丟失的情況剪芍。一個可選可能包含一個值或是 nil 來表示值缺失。使用問號(?) 來表明變量為可選的韧掩。

let optionalInt: Int? = 9

為了得到一個可選變量的值紊浩,需要展開它。稍后講學習展開它疗锐,但是最直接的辦法是使用強制展開運算符(!) 展開它坊谁。但請確保只在變量的值不為 nil 的情況下才使用這種方式。

let actualInt: Int = optionalInt!

可選在 Swift 中普遍存在口芍,在許多值或許存在或許不存在的情形下非常有用。尤其在嘗試類型轉換的時候特別有用鬓椭。

var myString = "7"
var possibleInt = Int(myString)
print(possibleInt)

在這段代碼中,myString 字符串內(nèi)容包含整形的值小染,所以轉換成功, possibleInt 的值變成7。但是如果修改 myString 為不能轉換成整數(shù)的內(nèi)容裤翩,possibleInt 就變成了 nil调榄。

myString = "banana"
possibleInt= Int(myString)
print(possibleInt)

數(shù)組是一種保存有序集合的數(shù)據(jù)類型踊赠。使用中括號([])創(chuàng)建數(shù)組呵扛,在括號中寫下標來訪問它們的元素。數(shù)據(jù)從下標 0 開始筐带。

var ratingList = ["Poor","Fine","Good","Excellent"]
ratingList[1] ="OK"
ratingList

使用構造器語法創(chuàng)建空的數(shù)組今穿,稍后你就會學習更多關于構造器的知識。

// 創(chuàng)建空數(shù)組.
let emptyArray = [String]()

你會注意上面的代碼中包含一行注釋伦籍。注釋不會作為代碼的一部分進行編譯但是提供了理解程序非常有用的信息蓝晒。單行注釋以雙正斜杠(//)作為起始標記,多行注釋起始標記為單個正斜杠后跟隨一個星號(/*)鸽斟,終止標記為一個星號后跟隨單個正斜杠 ( */ )拔创。你會看到在課程代碼的各處同時用到這兩種類型的注釋。

隱式解析可選是可以當做非可選值用的可選富蓄,當被訪問時不需要展開可選值。賦值后會被認為一直有值慢逾,盡管這個值可以改變立倍。它用感嘆號(!)而不是問號(侣滩?)表示口注。

var implicitlyUnwrappedOptionalInt: Int!

你很少需要在你的代碼中創(chuàng)建隱式解析可選。通常君珠,你會看到它們用在記錄界面和源代碼(會在后面一節(jié)課程中學到)之間的 outlets 中以及貫穿整套課程的 APIs 中寝志。

控制流

Swift 有兩種控制流語句。一種是像 if 和 switch 的條件語句策添,使用它們檢查條件是否為真 - 如果為真材部,執(zhí)行相應的代碼塊。一種是循環(huán)語句唯竹,如 for-in 和 while乐导,使用它們多次執(zhí)行相同的代碼塊。

if 語句檢查一個確定的條件是否為真浸颓,如果為真物臂,執(zhí)行括號中代碼。也可以向一個 if 語句添加 else 從句定義更復雜的判斷行為棵磷。

let number = 23
if number < 10 {
    print("The number is small")
} else if number > 100 {
    print("The number is pretty big")
} else {
    print("The number is between 10 and 100")
}
練習

修改 number 為一個不同的整形值看看結果是哪行打印出來仪媒。

嵌套語句可以在程序中創(chuàng)建復雜规丽,有趣的功能。下面例子在 for-in 語句(按順序在集合中一個接一個地遍歷每一項)中嵌套使用 if 語句和 else 從句冰抢。

let individualScores = [75,43,103,87,12]
var teamScore =0
for score in individualScores {
        if score >50 {    
             teamScore += 3
         } else {       
              teamScore +=1
        }
}
print(teamScore)

在 if 語句中使用可選綁定檢查變量是否有值挎扰。

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}
練習:
修改 optionalName 的值為 nil遵倦」俸常看能得到什么結果傲绣?添加 else 從句處理 optionalName 值為 nil 的情況。

如果 optionalName 為 nil续搀,判斷結果為 false菠净,會跳過大括號中代碼。否則牵咙,optionalName 會被展開并賦值給 name霜大,在代碼塊中可以訪問這個常量战坤。

你可以使用 if 來綁定多個值并使用 where 從句增加額外的判斷残拐。在下面這個例子中溪食,if 語句只在全部的值綁定成功并滿足 where 從句條件的情況下才執(zhí)行。

var optionalHello: String? = "Hello"
if let hello = optionalHello where hello.hasPrefix("H"), let name = optionalName {
    greeting = "\(hello), \(name)"
}

Swift 中 switch 語句同樣強大雀瓢。與 OC 只支持整形不同刃麸,它支持多種數(shù)據(jù)類型的比較司浪。在下面例子中, switch 語句比較 vegetable 和后面每個 case 的值吁伺,當匹配了就執(zhí)行相應的代碼塊篮奄。

let vegetable = "red pepper" 
switch vegetable {
   case "celery" :
      print("Add some raisins and make ants on a log.")
   case "cucumber", "watercress":
      print("That would make a good tea sandwich.")
   case let x where x.hasSuffix("pepper"):
      print("Is it a spicy \(x)?")default:print("Everything tastes good in soup.")
  }
練習:
刪除 default 語句宦搬,看看會有什么錯誤劫拗?

注意 let 怎么用在模式匹配中并把值賦給一個常量。就像在 if 語句一樣贰镣,where 從句可以添加到 case 中增加條件語句進一步的判斷控妻。然而弓候,不像在 if 語句菇存,switch 的 case 用逗號分割的多個條件,當每個條件都滿足時就會執(zhí)行亥至。
執(zhí)行完匹配的 switch case 的代碼后姐扮,程序會退出 switch 語句茶敏。并不會繼續(xù)向下個 case 執(zhí)行,所以不需要在每個 case 代碼結尾明確寫 break 來中斷 switch 語句萍肆。

switch 語句必須是完備的塘揣。這就是說亲铡,每一個可能的值都必須至少有一個 case 分支與之對應奖蔓。在不可能涵蓋所有值的情況下讹堤,可以使用默認(default)分支滿足該要求洲守,這個默認分支必須在 switch 語句的最后面。

使用區(qū)間來保存循環(huán)的下標知允。使用半閉區(qū)間運算符(..<)來創(chuàng)建一個下標的區(qū)間叙谨。

var firstForLoop = 0
for i in 0..<4 {
    firstForLoop += i
}
print(firstForLoop)

半閉區(qū)間運算符 ( ..< ) 并不包括最大值手负,所以此區(qū)間是從0到3的四次循環(huán)迭代虫溜。使用閉區(qū)間運算符(...)來創(chuàng)建一個包含全部值的區(qū)間。

var secondForLoop = 0
for _ in 0...4 {
    secondForLoop += 1
}
print(secondForLoop)

此區(qū)間是從0到4的五次循環(huán)迭代吱雏。當不需要用到當前執(zhí)行循環(huán)的值時歧杏,使用下劃線 (_) 這個通配符。

函數(shù)和方法

函數(shù)是可復用的指定代碼塊旺入,它可以在程序中很多地方被引用茵瘾。

使用 func 來定義一個函數(shù)拗秘。函數(shù)定義可以包括0個或更多參數(shù)祈惶,參數(shù)可以寫成 name:Type 形式,作為附加信息當函數(shù)被調(diào)用時必須傳遞值它們給函數(shù)凡涩。函數(shù)可以選擇是否有返回值疹蛉,返回值寫在 -> 后面可款,表明它們是作為結果返回的。函數(shù)的實現(xiàn)寫在一對大括號里面({})。

func greet(name:String, day:String) -> String {
   return "Hello \(name), today is \(day)."
}

通過在名字后面的括號中添加參數(shù)列表來調(diào)用一個函數(shù)翠拣。 當你調(diào)用一個函數(shù)误墓,參數(shù)列表的第一個參數(shù)可以不寫參數(shù)名谜慌,但是后面的參數(shù)需要加上參數(shù)名莺奔。

greet("Anna", day: "Tuesday")
greet("Bob", day: "Friday")
greet("Charlie", day: "a nice day")

在具體類型中定義的函數(shù)稱為方法。方法總是明確關聯(lián)定義它們的類型妨蛹,并且只能作為該類型的方法(或它的一個子類,稍后將會學到)蛙卤。在前面的 Switch 語句例子中颤难,可以看到 String 類中有個名叫 hasSuffix() 的方法,這里再一次用到已维。

let exampleString = "hello"
if exampleString.hasSuffix("lo") {
    print("ends in lo")
}

正如你所看到的衣摩,使用點語法調(diào)用方法艾扮。當調(diào)用的時候,可以不寫第一個參數(shù)名甫恩,但是后面參數(shù)需要寫磺箕。例如松靡,Array 的方法有兩個參數(shù)雕欺,但是只寫了第二個參數(shù)名:

var array = ["apple", "banana", "dragonfruit"]
array.insert("cherry", atIndex: 2)
array

類和構造器

在面向對象編程中棉姐,一個程序很大程度上依賴對象間的相互作用伞矩。對象是一個類的實例乃坤,它可以被認為是實際實體的一個藍圖沟蔑。類以屬性的形式存儲實體額外的信息溉贿,并且使用方法定義它的行為宇色。

使用 class 和類名來創(chuàng)建一個類宣蠕。類中屬性和方法的定義與之前的常量抢蚀、變量定義一樣镰禾,唯一的區(qū)別就是它們的上下文是類吴侦。同樣,方法和函數(shù)定義也是同一種寫法劫樟。下面例子定義一個 Shape 類叠艳,它有一個 numberOfSides 屬性和一個 simpleDescription() 方法附较。

class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

要創(chuàng)建一個類的對象翅睛,在類名后面加上括號。使用點語法來訪問對象的屬性和方法疏旨。下面的例子檐涝, shape 是 Shape 類的一個實例對象法挨。

var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()

這個 Shape 類缺少重要的東西:構造器凡纳。構造器是一個用來為類的每個屬性設置初始值以及執(zhí)行其他任何設置的方法荐糜。使用 init 來創(chuàng)建一個構造器暴氏。下面例子定義了一個新的類 NameShape,它有個構造器來接收 name 的值答渔。

class NamedShape {
    var numberOfSides = 0
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

注意 self 用來區(qū)分 name 屬性和構造器的 name 參數(shù)侥涵。確保對象的每個屬性都賦值了——無論是通過定義(就像 numberOfSides)還是通過構造器(就像 name)芜飘。

不能直接通過調(diào)用 init 方法來調(diào)用構造器;而是在類的名字和括號中寫上合適的參數(shù)冲呢。當以這種方式調(diào)用構造器時招狸,需寫上所有的參數(shù)和值裙戏。

let namedShape = NamedShape(name: "my named shape")

類能從它們的父類中繼承行為,類從其他類繼承功能被稱為那個類的子類,被繼承的類是父類营勤。在子類的名字后面加上父類名葛作,并用冒號分割猖凛。一個類只能繼承一個父類辨泳,盡管那個父類可以繼承別的父類第岖,諸如此類最終形成類的層次結構郊酒。

子類如果重寫父類的方法,需要用 override 標記 —— 如果沒有添加 override 就重寫父類方法的話編譯器會報錯荠耽。編譯器同樣會檢測 override 標記的方法是否確實在父類中。

下面例子定義 Square 類银亲,它是 NamedShape 的子類务蝠。

class Square: NamedShape {
    var sideLength: Double
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }
    
    func area() ->  Double {
        return sideLength * sideLength
    }
    
    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }
}
let testSquare = Square(sideLength: 5.2, name: "my test square")
testSquare.area()
testSquare.simpleDescription()

注意 Square 類的構造器執(zhí)行了三步不同的操作

  1. 設置子類 Square 定義的屬性的值。
  2. 調(diào)用父類 NamedShape 的構造器。
  3. 改變父類 NamedShape 的屬性值砍濒。這個階段可以調(diào)用方法、設置 getters 和 setters 等操作。

對象的構造過程有可能失敗陪白,需要定義為一個可失敗構造器序厉,其語法為在 init 關鍵字后面添加問號 (init?) 而柑。這里所指的“失敗”是指,如給構造器傳入無效的參數(shù)值妙同,或缺少某種所需的外部資源茎辐,又或是不滿足某種必要的條件等依啰。

class Circle: NamedShape {
    var radius: Double
    
    init?(radius: Double, name: String) {
        self.radius = radius
        super.init(name: name)
        numberOfSides = 1
        if radius <= 0 {
            return nil
        }
    }
    
    override func simpleDescription() -> String {
        return "A circle with a radius of \(radius)."
    }
}

構造器同樣可以有些相關的關鍵字钧唐。指定構造器不需要任何關鍵字帅韧。這種構造器作為類的主要構造器帘饶;類中任何的構造器必須最終調(diào)用一個指定構造器竞阐。

構造器旁邊的 convenience 關鍵字表示它是一個便利構造器。便利構造器是輔助的構造器貌嫡。用于增加額外和定制的功能,但必須最終調(diào)用一個指定構造器粒督。

構造器旁邊的 required 關鍵字表示擁有這個構造器的每個子類必須實現(xiàn)它自己的版本而不能直接繼承父類的構造器(如果它實現(xiàn)了任何其他構造器)桐绒。

類型轉換用在類層次結構上吉挣,檢查類型能否轉換,如果可以將類型轉換成這個層次結構中的其他類型。

一個確定類類型的常量或變量幕后可能屬于它的子類實例慨代。當確定是這種情況時杨箭,可以使用類型轉換運算符嘗試下轉到這個子類型稻艰。

因為向下轉型可能會失敗,所以 as 有兩種不同寫法僧凤≡樱可選方式澎语,as?验懊, 返回一個你試圖轉換類型的可選值义图。強制形式 as! 把向下轉型和強制解包結合為單一復合操作碱工。

當你不確定向下轉型是否成功時奏夫,用可選類型轉換符(as?)酗昼。它總是返回一個可選值,如果下轉不可能值將變?yōu)?nil。這能讓你檢查向下轉型是否成功碟婆。

只有在你確定向下轉型一定成功時,才使用 as! 公给。當你試圖向下轉型為一個不正確的類型時淌铐,會觸發(fā)一個運行時錯誤蔫缸。

在這個例子中使用 as? 檢查 shape 數(shù)組中元素中是否是正方形或三角形拾碌。如果是,相應增加 squares 和 triangles 變量的計數(shù)弟跑,最后打印值孟辑。

class Triangle: NamedShape {
    init(sideLength: Double, name: String) {
        super.init(name: name)
        numberOfSides = 3
    }
}
 
let shapesArray = [Triangle(sideLength: 1.5, name: "triangle1"), Triangle(sideLength: 4.2, name: "triangle2"), Square(sideLength: 3.2, name: "square1"), Square(sideLength: 2.7, name: "square2")]
var squares = 0
var triangles = 0
for shape in shapesArray {
    if let square = shape as? Square {
        squares++
    } else if let triangle = shape as? Triangle {
        triangles++
    }
}
print("\(squares) squares and \(triangles) triangles.")
練習

嘗試使用 as! 替換 as?扑浸。看能得到什么錯誤础嫡?

枚舉和結構體

在 Swift 中類不是定義數(shù)據(jù)類型的唯一方式榴鼎。枚舉和結構體和類具有類似的能力巫财,但在不同的情況下可以非常有用哩陕。

枚舉為一組關聯(lián)的值定義一個通用類型悍及,讓你在代碼中以一種安全的方式使用這些值心赶。枚舉也可以包含關聯(lián)的方法。

使用 enum 來創(chuàng)建一個枚舉椭符。

enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
        switch self {
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queen"
        case .King:
            return "king"
        default:
            return String(self.rawValue)
        }
    }
}
let ace = Rank.Ace
let aceRawValue = ace.rawValue

在上面的例子中销钝,枚舉原始值的類型是 Int曙搬,所以你只需設置第一個 case 的原始值纵装。剩下的原始值會按照順序賦值橡娄。你也可以使用字符串或者浮點數(shù)作為枚舉的原始值癣籽。使用 rawValue 屬性來訪問一個枚舉成員的原始值。

使用 init?(rawValue:) 構造方法在原始值和枚舉之間進行轉換瓶籽。

if let convertedRank = Rank(rawValue:3) {
   let threeDescription = convertedRank.simpleDescription()
}

枚舉的成員值是實際值塑顺,而不是原始值的另一種寫法严拒。事實上,有時不需要為 cases 賦一個沒有意義的原始值裤唠。

enum Suit {
    case Spades, Hearts, Diamonds,Clubs  

    func simpleDescription()-> String {
      switch self  {
         case .Spades: return "spades"
         case .Hearts: return "hearts"
         case .Diamonds: return "diamonds"
         case .Clubs:  return "clubs" }   
    }
}

let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()

注意种蘸,上面提到兩種使用 Hearts 成員的方式:給 hearts 常量賦值時航瞭,因為它沒有顯式指定類型,所以 Suit.Hearts 用全名來表示。在 switch 里,因為已知 self 的類型,所以枚舉成員可以使用縮寫如 .Hearts 來引用长窄。

結構體支持許多和類相同的功能挠日,包括方法和構造器。它們之間最大的一個區(qū)別就是當在代碼中傳遞它們時冬骚,結構體是以拷貝形式的只冻,而類是以引用形式傳遞的喜德。當你不需要繼承和類型轉換的功能時垮媒,用結構體定義輕量級數(shù)據(jù)類型非常棒。

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()

協(xié)議

協(xié)議定義方法饮醇,屬性和其他要求的一個藍圖秕豫,它適合一個特定的任務或功能馁蒂。協(xié)議不為這些要求提供實際的實現(xiàn)-它僅僅描述這個實現(xiàn)是什么樣子的。
類饵隙、結構體或枚舉都可以遵循協(xié)議金矛,并為協(xié)議定義的這些要求提供具體實現(xiàn)驶俊。任何滿足一個協(xié)議的要求的類型被說成遵循那個協(xié)議了饼酿。?

使用 protocol 關鍵字來定義協(xié)議胚膊。

protocol ExampleProtocol {
    var simpleDescription: String { get }
    func adjust()
}
注意:
simpleDescription 屬性后面的 { get } 表示它是只讀的,這意味著屬性的值可以讀取药版,但不能修改槽片。

類还栓,結構體和枚舉通過在名字后面列出協(xié)議的名字并用冒號分割來遵循協(xié)議。類型可以同時遵循幾個協(xié)議蝙云,把這些協(xié)議放在逗號分割的列表中勃刨。如果一個類有父類,這個父類的名字必須出現(xiàn)在列表的第一個身隐,而協(xié)議跟在后面贾铝。通過實現(xiàn)協(xié)議的所有要求來遵循這個協(xié)議垢揩。

下面的例子中,SimpleClass 通過實現(xiàn) simpleDescription 屬性和 adjust() 方法來遵循 ExampleProtocol 協(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 

協(xié)議是頭等類型蚀瘸,意味著它們可以被當做其他命名類型贮勃。例如苏章,你可以創(chuàng)建 ExampleProtocol 數(shù)組來調(diào)用其中的每個實例的 adjust() 的方法(因為協(xié)議的強制要求,數(shù)組中每個實例都保證實現(xiàn)了 adjust()方法)泉孩。

class SimpleClass2: ExampleProtocol {
    var simpleDescription: String = "Another very simple class."
    func adjust() {
        simpleDescription += "  Adjusted."
    }
}
 
var protocolArray: [ExampleProtocol] = [SimpleClass(), SimpleClass(), SimpleClass2()]
for instance in protocolArray {
    instance.adjust()
}
protocolArray

Swift 和 Cocoa Touch

Swift 做了很好的設計使它能與 Cocoa Touch 這個用來開發(fā) iOS app 的框架集無縫交互棵譬。當你學完后續(xù)課程预伺,你會對 Swift 與 Cocoa Touch 交互有個基本的了解酬诀。

到目前為止瞒御,你一直致力于 Swift 標準庫中的數(shù)據(jù)類型神郊。Swift 標準庫是 Swift 語言內(nèi)置數(shù)據(jù)類型集和功能集趾唱√瘃可以在標準庫中看到像 String 和 Array 這樣的數(shù)據(jù)類型例子悠咱。

let sampleString: String = "hello"
let sampleArray: Array = [1, 2, 3.1415, 23, 42]
練習

在 Xcode 中按住 Option 鍵點擊類型來閱讀標準庫中的類型析既。當查看 Xcode 的 playground 時谆奥,Option+點擊上面代碼中的 String 和 Array雄右。

當開發(fā) iOS 應用程序時擂仍,將使用不止 Swift 標準庫。其中一個使用最頻繁的框架是 UIKit肋坚。UIKit 包含一些 app UI 層很有用的類智厌。

為了訪問 UIKit盲赊,在 Swift 文件或者 playground 中簡單的以模塊的形式導入。

import UIKit

導入 UIKit 后就可以使用 Swift 語法來訪問 UIKit 類型以及類型的方法和屬性诚卸,等等绘迁。

let redSquare = UIView(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
redSquare.backgroundColor = UIColor.redColor()

這些課程介紹的很多類都來自 UIKit,所以你經(jīng)常會看到這個 import 語句缀台。

有了這些 Swift 方面的知識后,你將在下一課進入開發(fā)一個完整的 app 的過程鼎俘。盡管本課還停留在 playgrounds 的程度辩涝,但請記住它們在 app 調(diào)試方面是強有力的工具膀值,能做到可視化復雜的代碼以及快速產(chǎn)生原型沧踏。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翘狱,一起剝皮案震驚了整個濱河市潦匈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赤惊,老刑警劉巖凰锡,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掂为,死亡現(xiàn)場離奇詭異,居然都是意外死亡昼扛,警方通過查閱死者的電腦和手機抄谐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門斯稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迹恐,“玉大人殴边,你說我怎么就攤上這事锤岸∈峭担” “怎么了蛋铆?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵刺啦,是天一觀的道長玛瘸。 經(jīng)常有香客問我糊渊,道長,這世上最難降的妖魔是什么蒙兰? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮挠他,結果婚禮上篡帕,老公的妹妹穿的比我還像新娘镰烧。我一直安慰自己怔鳖,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懂傀,像睡著了一般蹬蚁。 火紅的嫁衣襯著肌膚如雪犀斋。 梳的紋絲不亂的頭發(fā)上闪水,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天球榆,我揣著相機與錄音朽肥,去河邊找鬼。 笑死持钉,一個胖子當著我的面吹牛衡招,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播每强,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼始腾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了空执?” 一聲冷哼從身側響起浪箭,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辨绊,沒想到半個月后宣鄙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年握玛,在試婚紗的時候發(fā)現(xiàn)自己被綠了挠铲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片安聘。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡念颈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肌括,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布珠漂,位于F島的核電站媳危,受9級特大地震影響鸣皂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荆陆,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一趟据、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸冲茸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摧冀。三九已至惭适,卻和暖如春框产,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工韵丑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像奔坟,于是被迫代替她去往敵國和親鸯隅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

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