Start Developing iOS Apps (Swift) 中文翻译版
Getting Started
Jump Right In
(這句實在不好翻譯)
給CSDN提個建議,把markDown的目錄放到左側更隨,在文章頂部太難用了
開發iPhone和ipad,本教程是一個完美的起點,這套課程將作為一個引導教你建立自己的APP,包括工具的最佳使用,語法概念,這將讓你的學習路徑更平坦。
每節課程都包含一個教程和你需要了解的概念信息,課程是彼此相關聯的,你將通過一步步的完成課程中的內容,實現一個真正的APP應用。
當你完成了本課程,你將了解ios應用開發的概念,并且會對swift變成語言有個更深入的了解,而且會發現xcode許多有價值的功能。
About the Lessons(關于教程)
在這個教程里,你將開發一個簡單的simple meal tracking app 名字叫FoodTracker。這個app用列表(list)展示美食(meals),并且可以新增或者編輯美食的名稱,對美食進行評分,給美食添加圖片。
怕你們看不到圖片,我還特意把圖片重新傳了一遍。
第一課是一個playground,playground可以讓你交互式的看到程序運行的結果。你可以下載代碼并運行(代碼我稍后找個國內的git方上去)。
剩下的課程將完成一個xcode的project,這個project會像上面的展示的一樣。
Get the Tools(獲取開發工具)
你可以沖AppStore獲取最新版本的xcode。而且完全是免費的。
提示:
本課程使用xcode 7.0 和 ios sdk 9.0。確保你的版本是正確的
好吧!我們現在開始學習吧。
廣告一下:www.vbao100.com,大家多支持啊
Learn the Essentials of Swift (學習要點)
第一個通過playground來學習swift語言,你可以在playground上更改代碼,這樣有助于迅速理解并掌握swfit語言
提示
因為github訪問并不是非常順利,playground代碼我會找一個合適的git放上去,稍后我會提供下載地址,
學習目標
本課程結束時,你需要掌握:
- 常量(constant)和變量(variable)的區別
- 知道何時使用隱式聲明或者顯式聲明
- 理解可選型(optionals)和解包可選型(可能翻譯不準確,這個有點類似java的optional)
- 區分解包可選型和不解包可選型(才疏學淺啊,翻譯不來,原文:Differentiate between optionals and implicitly unwrapped optionals)
- 了解循環語句和循環條件
- 掌握switch語句
- 掌握where語句
- 區分函數(function)、方法(methods)、初始化(initializers)
- 區分類(class)、結構體(structures)、枚舉(enumerations)
- 理解繼承(inheritance)和協議(protocol )
- 確定隱式類型和使用Xcode的快速幫助快捷找到更多的信息
- 引入(import)并且使用UIkit
基本類型
常量(constant )聲明后不可以更改,而變量(variable )聲明后可以更改他的值。
用let聲明常量
用var聲明變量
在swift中,不管是常量還是變量,都是有他的類型(type)的,但是你不需要顯示的定義,swift可以自行推斷他的類型。像上面的例子中,myVariable是整形(int),myConstant也是整形。
但是,變量一旦聲明,是不可以改變他的類型的。
另外,如果你在聲明變量時提供的值不能有足夠的信息來確定變量的類型,需要顯示的聲明(我理解是這樣的)
let implicitInteger = 70 let implicitDouble = 70.0 let explicitDouble: Double = 70提示
在xcode中,按住 option 鍵并且點擊變量,可以查看變量的類型
變量永遠不會隱式的轉換為另外一種類型,如果想要將變量轉換為另外一種類型,你必須顯示的轉換
let label = "The width is " let width = 94 let widthLabel = label + String(width)有一種簡單的方法可以往字符串中插值,就是在()前面加\,()內寫變量
let apples = 3 let oranges = 5 let appleSummary = "I have \(apples) apples." let fruitSummary = "I have \(apples + oranges) pieces of fruit."可選型(optionals )的聲明
let optionalInt: Int? = 9可選型一旦聲明,意味著他一定有值,這個值要么是問號前面的類型,要么是nil值
個人理解
這個應該是swift語言的異常處理機制吧,但是我不用用,寫程序時永遠在這個上面出錯,但是又不知道怎么捕獲異常
你必須對他進行解包才能獲得optional下面的值,解包使用!
只有使用解包符號(!)才能確定optional不為nil
這種類型在編程過程中使用非常廣泛。(所實話,我幾乎所有的錯誤都出在這里)
var myString = "7" var possibleInt = Int(myString) print(possibleInt)上面的代碼中,possibleInt = 7 ,因為 myString 里面有個7的整數,但是如果把 myString 改成其他的,不一定能轉換成整形,possibleInt可能就是nil
myString = "banana" possibleInt = Int(myString) print(possibleInt)隱式解包可選類型可以像非可選類型值一樣使用,并不需要在每次使用時都解包一次。這種用法的前提是隱式解包類型始終是有值的
var implicitlyUnwrappedOptionalInt: Int!數組(array)是一種有序的數據的集合,使用[]聲明,數組的索引從0開始
var ratingList = ["Poor", "Fine", "Good", "Excellent"] ratingList[1] = "OK" ratingList創建一個空數組的語法
// Creates an empty array. let emptyArray = [String]()注釋的聲明可以有兩種方式
使用 //
使用 /* */
沒有寫完,改天繼續翻譯,翻譯起來比學的還慢~~~~
我兄弟的網站,大家捧捧場:唯寶網–赴美生子社區,www.vbao100.com
optional一旦聲明,一定是有一個默認值的,這個默認值可能是nil,使用的時候可以對optional進行解包。(這個是我自己的理解:原文:An implicitly unwrapped optional is an optional that can also be used like a nonoptional value, without the need to unwrap the optional value each time it’s accessed. This is because an implicitly unwrapped optional is assumed to always have a value after that value is initially set, although the value can change. Implicitly unwrapped optional types are indicated with an exclamation mark (!) instead of a question mark (?).)
var implicitlyUnwrappedOptionalInt: Int!你很少需要在您自己的代碼創建隱式打開optional。
流程控制語句
swift中有兩種流程控制語句,一種是條件控制語句,如if何switch,
一種是循環控制語句,比如 for-in 和 while。
if語句的示例:
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") }if語句可以用來檢查optional類型的變量是否有值
var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName {greeting = "Hello, \(name)" }上面的例子中,如果optionalName為nil值,那么在if語句中optionalName不會被解包,name也不會被賦值,if的條件是false。
if 語句后面可以跟多個條件,如果要讓if語句的內容被執行,那么他的條件必須都為true才可以,比如:
var optionalHello: String? = "Hello" if let hello = optionalHello where hello.hasPrefix("H"), let name = optionalName {greeting = "\(hello), \(name)" }switch語句在swift中是非常強大的,他在swift中支持各種類型的數據比較操作,比局限于數字或字符串。
let vegetable = "red pepper" switch vegetable { case "celery":let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress":let vegetableComment = "That would make a good tea sandwich." case let x where x.hasSuffix("pepper"):let vegetableComment = "Is it a spicy \(x)?" default:let vegetableComment = "Everything tastes good in soup." }注意上面代碼中常量(let vegetableComment)何時被定義,這個有點像if語句的條件,where比用來進一步約束條件,當條件成立時,let vegetableComment才會被定義。
在swift語言中,swtich語句會在執行完case后直接跳出循環,所以你不必再每個case后添加跳出循環的語句。
switch必須能夠覆蓋全部的情況,所以默認情況下要有default語句,但是在switch的條件是枚舉類型時(enumeration),你可以做到用case覆蓋全部的情況,可以不用設置default。
var firstForLoop = 0 for i in 0..<4 {firstForLoop += i } print(firstForLoop)上面的例子中使用了半開操作符( ..<),半開操作符不包含該該數值,所以他的循環是沖0到3,如果你用封閉操作符(…),他會包含這個數值,比如
var secondForLoop = 0 for _ in 0...4 {secondForLoop += 1 } print(secondForLoop)_ 是一個通配符
函數和方法
function 一個可重用的代碼段。
使用func定義一個方法,方法可以包含0個到多個參數,參數的定義方法是name: Type,函數的返回值是可選的,如果有返回值,要用(->)定義返回值類型。
調用函數(第一個參數不用寫他的名字)
greet("Anna", day: "Tuesday") greet("Bob", day: "Friday") greet("Charlie", day: "a nice day")方法(methods)是一種特殊的函數,方法的調用可以使用點操作符。
類和初始化
在面向對象的編程過程中,程序的行為主要是在對象之間進行交互的。
object 是class的一個實例,class是object的設計藍圖。
class存儲有關自己的附加信息的屬性,并使用方法定義自己的行為。
類的定義使用關鍵字class,屬性定義和定義變量一樣,方法定義和函數定義一樣。
class Shape {var numberOfSides = 0func simpleDescription() -> String {return "A shape with \(numberOfSides) sides."} }創建一個類的實例對象,使用點符號調用類的屬性或方法。
var shape = Shape() shape.numberOfSides = 7 var shapeDescription = shape.simpleDescription()初始化initializer是一個方法method,該方法method為類class實例的使用做一些準備工作
class NamedShape {var numberOfSides = 0var name: Stringinit(name: String) {self.name = name}func simpleDescription() -> String {return "A shape with \(numberOfSides) sides."} }class 中的屬性在實例化時必須是有值得,不管是在屬性定義時還是在初始化時。
初始化方法不可以用init來調用,但可以通過實例化的時候調用他。
let namedShape = NamedShape(name: "my named shape")子類可以繼承父類的屬性,子類也可以繼承父類的方法,并對方法進行重寫(使用 override 關鍵字)
class Square: NamedShape {var sideLength: Doubleinit(sideLength: Double, name: String) {self.sideLength = sideLengthsuper.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()有時,對象的初始化可能會出錯,比如,參數提供的值超出范圍,或者參數缺失,這叫做failable初始化,他會返回一個nil值,
class Circle: NamedShape {var radius: Doubleinit?(radius: Double, name: String) {self.radius = radiussuper.init(name: name)numberOfSides = 1if radius <= 0 {return nil}}override func simpleDescription() -> String {return "A circle with a radius of \(radius)."} } let successfulCircle = Circle(radius: 4.2, name: "successful circle") let failedCircle = Circle(radius: -7, name: "failed circle")枚舉和結構體
枚舉(Enumerations)和結構體(structures)有類差不多的功能。
enumerations 是一組相關的值。
enumerations 可以有自己的方法。
創建enumeration的方法是使用關鍵字enum
enum Rank: Int {case Ace = 1case Two, Three, Four, Five, Six, Seven, Eight, Nine, Tencase Jack, Queen, Kingfunc 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,所以你必須指定第一個原始值。原始值的其余部分分配秩序。您還可以使用字符串或浮點數為原始類型枚舉。使用rawValue屬性來訪問枚舉成員的原始值。
使用init ?( rawValue :)初始化
if let convertedRank = Rank(rawValue: 3) {let threeDescription = convertedRank.simpleDescription() }結構體和類非常相似,他們最主要的區別是,在代碼中傳值時,結構體是復制,而類是引用。
用struct創建結構體
struct Card {var rank: Rankvar suit: Suitfunc simpleDescription() -> String {return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"} } let threeOfSpades = Card(rank: .Three, suit: .Spades) let threeOfSpadesDescription = threeOfSpades.simpleDescription()協議(Protocols)
協議適合用來設計一個功能的藍圖,包括方法和屬性。協議實際上不會提供任何功能設計,只是描述一個功能的樣子。協議可以隨后通過類或者枚舉、結構體來提供代碼邏輯,滿足協議要求的任何類型被認為符合該協議。
用protocol來定義協議
protocol ExampleProtocol {var simpleDescription: String { get }func adjust() }提示
在simpleDescription后的{ get }屬性表明它是只讀的,這意味著該屬性的值可以查看,但不可以改變。
類、枚舉、結構體要采用協議,使用:后面跟協議的名字,如果要采用多個協議,就用逗號分隔,如果這個類有父類,那么父類必須寫在:后的第一個位置。
這里, SimpleClass采用ExampleProtocol協議,并通過實施simpleDescription屬性和adjust()方法符合協議。
class SimpleClass: ExampleProtocol {var simpleDescription: String = "A very simple class."var anotherProperty: Int = 69105func adjust() {simpleDescription += " Now 100% adjusted."} } var a = SimpleClass() a.adjust() let aDescription = a.simpleDescriptionswift 和 cocoa touch
現在,你已經掌握了swift的標準庫,但是在開發是,可能會用到很多超出標準庫的東西,最多的可能是UIKit。
引入UIKit
import UIKit感謝唯寶網朋友的支持,我很多都是問他們的,呵呵。
大家多支持下他們的網站,www.vbao100.com
Building The UI
Build a Basic UI
這一課主要是熟悉xcode工具,通過這節課,你將建立一個簡單的UI,他應該像下面這個樣子:
學習目標
- xcode中創建項目
- 知道xcode創建工程文件后的關鍵內容
- 打開或者切換文件或者工程
- 通過模擬器運行app
- 增加、修改、刪除storyboard上的UI元素
- 通過 Attributes inspector 調整UI的屬性
- 查看和使用outline view重新排列UI元素
- 用Preview assistant editor預覽UI
- 制定出能自動適應使用自動布局在用戶的設備尺寸的UI
創建一個新工程
Xcode中包括一些內置的開發常見類型的iOS應用程序,如游戲,基于選項卡的導航應用,以及應用模板表視圖為基礎的應用程序。大多數的這些模板已經預先配置接口和源代碼文件。單查看應用程序:在這一課中,你將與最基礎的模板開始。
創建新工程
1、打開xcode
如果出現的不是歡迎窗口項目窗口,不用擔心,你可能創建或在Xcode中打開了一個項目之前。只要使用菜單項在下一步創建項目。
2、在歡迎界面,點擊“Create a new Xcode project”(或者File > New > Project)
xcode打開一個新窗口讓你選擇模板。
3、在iOS中選擇application,
4、在主界面,選擇 Single View Application并點擊next
5、在出現的對話框中,使用下列值命名您的應用程序,并為項目選擇附加選項:
- Product Name: FoodTracker
Xcode使用你輸入名字命名您的項目和應用程序的產品名稱。
Organization Name: 您的組織或你自己的名字。留空
- Organization Identifier: 你的組織標識符
- Bundle Identifier: 這個值是根據您的產品名稱和組織標識符自動生成。
- Language: Swift
- Devices: Universal ,一種通用的應用程序可以在iPhone和iPad上運行。
- Use Core Data: Unselected.
- Include Unit Tests: Selected.
- Include UI Tests: Unselected.
6、點擊next
7、出現一個新的對話框,選擇保存地址,xcode會在workspace window自動打開你的新工程。
熟悉xcode
運行模擬器
1、在 Scheme pop-up menu選擇iphone6
2、點擊Run button
也可以選擇 Product > Run (或用快捷鍵 Command-R).
查看源代碼
AppDelegate.swift
1、確保 project navigator 打開的是 navigator area.
在Project Navigator顯示項目中的所有文件。如果project navigator沒有打開,點擊navigator selector bar最左邊的按鈕。 (或者,選擇iew > Navigators > Show Project Navigator)
2、如果需要的話,按一下旁邊的三角形來打開它在Project Navigator的FoodTracker文件夾。
3、選擇 AppDelegate.swift
AppDelegate.swift有兩個主要的函數
- 它創建的進入點,讓你的應用程序運行和循環,提供輸入事件到您的應用程序。這項工作是交由UIApplicationMain屬性( @UIApplicationMain )。 UIApplicationMain創建應用程序對象,該對象是負責管理該應用的生命周期和應用程式委托對象。
- 它定義一個AppDelegate類,這個類是用來規劃應用程序的委托對象。
該AppDelegate類包含一個屬性:window。與此屬性在應用程序所有的窗口上都會被委托跟蹤。窗口屬性是optional,這意味著它可以在某一點上具有任何nil值。
var window: UIWindow?該AppDelegate類也包含重要方法的模板實現。這些預定義的方法允許應用程序對象和應用程序委托通訊。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool func applicationWillResignActive(application: UIApplication) func applicationDidEnterBackground(application: UIApplication) func applicationWillEnterForeground(application: UIApplication) func applicationDidBecomeActive(application: UIApplication) func applicationWillTerminate(application: UIApplication)在應用程序狀態轉換,例如,應用程序啟動,過渡到背景,應用終止,應用程序對象沖委托調用相應的方法,讓它一個作出適當的反應。你不需要做任何特殊的事情以確保這些方法在正確的時候被調用,應用程序對象幫你處理了那部分工作。
每一種自動實現的方法有一個默認的行為。如果模板實現空或從AppDelegate類中刪除這些方法,那么應用程序只會調用該方法的默認行為。給這些方法模板添加自定義代碼,它會在被調用的時候執行。
在這一課中,你將不會被使用的自定義應用程序委托代碼,所以你沒有做對AppDelegate.swift文件進行任何更改。
View Controller 源文件
每一個視圖模板有一個源文件:ViewController.swift ,從project navigator選擇他查看文件。
這個文件定義了一個UIViewController的子類,并命名為ViewController。這個類繼承了UIViewController的行為。要擴展或者重寫這些方法,你可以用override重寫UIViewController
里面的方法。
在這一科中,你不需要重寫didReceiveMemoryWarning方法,所以可以直接刪掉。
現在,你的代碼應該看起來是這樣的:
打開storyboard
storyboard是應用程序的用戶界面的可視化表示,顯示內容和屏幕之間的通訊。您可以使用storyboard制作應用程序流程。
打開你的storyboard
- 在project navigator中選擇main.storyboard
你的storyboard應該看起來像這樣:
現在,你的storyboard中只包含了一個場景(scene),場景左邊的箭頭是進入點,他表示這個場景將在app啟動后第一個被載入。
當你在iPhone6模擬器上跑你的app時,在這個場景中的東西就是你在設備屏幕上看到的東西。但是,當你看到畫布(canvas)上的場景時,你會發現它不具備iPhone6屏幕的確切尺寸。這是應為場景只是一個通用表達,他可以適用于任何設備和任何方向。你可以定義自適應的用戶界面,讓他在任何設備和任何方向都有良好的表現。
建立基本的UI
xcode提供一個對象庫,你可以把里面的添加到storyboard中。其中一些元素會直接呈現在UI上,比如label,text field,但是有一些元素不會呈現在UI上,比如手勢識別,和視圖控制器(view controllers)。
出現在UI的元素被稱作views。views把內容呈現給用戶。他們是你構建UI的基礎。他們有各種內置的行為,包括顯示自己和反應用戶輸入。
所有的view對象都是UIView類或者他的子類。
通過添加一個文本框(UITextField類)的UIView這樣一個子類到場景。他是一個文本字段,可在單行輸入文本作為一餐的名稱。
添加一個text field到你的用戶界面
- 打開Object library
- 找到或者使用filter field找到text field
- 拖動他到你的場景中
- 拖動text field 到合適的大小
配置text field
- 在text field 被選中的情況下,打開Attributes inspector
- 找到Placeholder并輸入Enter meal name
配置text field的鍵盤
- 在text field 被選中的情況下,打開Attributes inspector
- 找到Return Key的標簽并且選擇select Done(這一變化將使得鍵盤上的默認回車鍵改變成一個完成的關鍵。)
- 找到Auto-enable Return Key并選中(這一變動確保用戶就不會進入一個空字符串作為一餐的名稱。)
添加一個label到你的場景
label不是交互式的;它只是顯示在UI的靜態文本。為了幫助您了解如何在UI元素之間的交互定義,您將配置這個標簽來顯示用戶輸入到文本字段中的文本。這將是測試文本字段走的是用戶輸入,并正確處理它的好方法。
在Object library中找到label并把他拖入到場景中,改變他的大小,雙擊并且輸入 Meal Name。
添加一個button到場景
在object library中找到button,并把他拖入到場景,雙擊改變他的文字為Set Default Label Text.
查看outline view
outline view讓你看到你的storyboard中的對象的分層表示。你應該能夠看到text field,label和button。
views不僅在屏幕上顯示自己和響應用戶的輸入,可作為其他視圖的容器。
視圖有不同的層級,內部的為子視圖。
預覽用戶界面
打開 assistant editor.選擇 Automatic to Preview > Main.storyboard (Preview).
你可以不用模擬器看到界面效果
這個UI和我們設想的不一樣,因為他并不適應當前的用戶界面尺寸。
采用auto layout
關閉預覽界面,只打開storyboard。
- 按住 Shift 鍵,選擇 text field, label, 和 button.
- 在編輯器右下角,選擇stack(xcode會給選中的元素打個包,放在一個stack中,并且xcode會自動識別這些元素應該是水平分布還是垂直分布)
- 在Attributes inspector中找到Spacing field并且輸入12
- 選中Pin按鈕,調整設置
未完,待續。。。。
總結
以上是生活随笔為你收集整理的Start Developing iOS Apps (Swift) 中文翻译版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu php mysql 乱码,
- 下一篇: 高考恋爱100天 完全攻略