天天看點

Swift翻譯之-Swift文法入門 Swift文法介紹

目錄[-]

hello world - swift

簡單指派

控制流

函數與閉包

對象和類

枚舉與結構

協定和擴充

泛型

2014.6.3日,蘋果公布最新程式設計語言swift,swift是一種新的程式設計語言,用于ios和os x應用的開發,沒有c的相容性限制,swift采用安全的程式設計模式,增加了現代功能,使程式設計變得容易,更靈活,更有趣,swift的重新設計,依靠成熟和 備受喜愛的cocoa, cocoa touch 架構,是重新構想軟體如何開發的機會。

​​

Swift翻譯之-Swift文法入門 Swift文法介紹

​​ 

傳統建議新語言的第一個程式是列印“hello world”,對于swift是下面的一行代碼

如果你用c或者objective-c編寫過代碼,這段句法會感覺熟悉,在swift中,這是一行完整的代碼,不需要引入單獨的庫比如輸入輸出或者字元串 操作,在全局作用域下編寫的代碼會作為程式的入口,是以你也不需要main函數,你同樣不需要在每段代碼後面寫分号 這次tour将教你使用swift程式設計的足夠資訊,完成各種程式設計任務,如果你有不了解也不用擔心,本次示範的任何内容在後面的章節中都有詳細的介紹

使用 let定義常量,使用var定義變量,常量的值不需要在編譯的時候知道,但你必須隻設定一次,這意味着你可以使用常量來定義這樣的數值:一次決定,多處使用

常量和變量必須為你指定的類型,但是你并不需要總是顯示的指定類型,建立變量或者常量時,直接提供一個數值讓編譯器知道他的類型,下面的例子中,編譯器指 定myvariable為整型,因為他的初始值是一個整型 如果初始值沒有足夠的資訊(比如沒有初始值),可以在變量後面指定一個類型,通過冒号分割

數值不會隐式的轉換成另一種類型,你必須轉換成另一種類型,顯式的指定類型

有更簡單的方式讓字元串中包含數值:在小括号中編寫數值,并在括号之前寫上(\),如下例:

使用中括号[]建立數組和字典,通過序号或者key來通路集合中的元素

建立一個空的數組或者字典,使用下面的初始化文法

如果類型資訊可以被斷定,你可以寫一個空數組[],或者一個空的字典[:],比如當你為一個變量設定新的值,或者給函數傳遞一個參數

使用if和switch判斷條件,使用for-in, for, while和do-while 循環,條件或者循環參數的小括号是可選的,但是主體的花括号是必須的

if聲明中,條件必須是boolean表達式,這意味着類似 if score{…}de的寫法是錯誤的,不會隐式的與0比較 你可以将if和let結合使用,這意味着數值為可選,可選值可能是一個數值也可能是nil表示值缺失,在類型後面标記問号(?)表示這個值為可選

如果可選值為nil,條件為flase,代碼會被跳過,否則會進入并設定常量,使得變量在代碼體中可用 switch支援任何類型和多種操作符,不限于整型和相等操作

在執行完比對的條件後,程式将跳出選擇條件,不會繼續到下一個條件,是以不需要在每個條件中指定break

使用while重複一段代碼塊知道條件改變,循環條件也可以放在後面,這樣可以確定循環被至少調用一次

可以使用序号周遊,既可以使用.. 指定序号範圍,也可以寫完整的表達式

使用 func聲明一個函數,通過函數名和參數調用一個函數,使用 -> 聲明函數傳回類型

使用值組表示多個數值傳回

函數還可以設定可變參數,會将他們整合到一個數組中

函數可以嵌套,嵌套函數可以通路外部函數的聲明的變量,對于很長或者複雜的函數,你可以使用嵌套函數來組織代碼

函數也是一種類型(第一等類型),這意味着你可以傳回一個函數作為函數傳回值

函數還可以作為另一個函數的參數

閉包實際上是函數的一種特殊形式,你可以寫一個閉包,使用花括号({})包裹代碼,沒有函數名,使用 in 來分隔傳入參數和傳回類型

你可以選擇更簡潔的閉包方式,當一個閉包類型已知,比如某個委托的回調函數,你可以省略它的參數和傳回類型,單聲明的閉包預設會傳回這個唯一的聲明變量

你可以通過序号替代名稱來通路參數,這種方式尤其适合非常短的閉包

使用class建立類,類中的屬性聲明與常量和變量聲明一樣,隻是他位于這個類的上下文中,同樣的函數和方法聲明也一樣

建立一個類執行個體,使用類名加括号,使用點操作符通路執行個體的屬性和方法

這個版本的shape類缺少一些重要的東西:用于初始化這個類的構造器,可以使用init來建立

注意,使用self來就差別傳入參數的name和自身的name屬性,構造器中的構造參數與函數參數的傳遞方式一樣,所有的屬性都需要指定值,可以在聲明 時指定(如numberofsides)也可以在構造函數中指定(如name) 如果你希望在對象被回收時執行清除動作,可以使用deinit建立一個析構器 子類名包含在父類名稱之後,使用冒号分隔,類不需要從任何标準的根類繼承,是以你可以包含或者忽略父類 子類中的重寫方法需要标記上override,如果沒有 override,會被編譯器檢查出錯,同樣編譯器還會檢測帶override标志的函數是否真的存在于父類中

除了簡單屬性外,屬性還可以具備getter和setter方法

在perimeter的setter函數中,新值隐式的命名為newvalue,你也可以在set後面的括号中提供一個顯式的名稱 注意equilateraltriangle類的構造函數有三步: 1、為子類聲明的屬性設定值 2、調用父類構造器 3、改變父類定義的屬性值,如何用到方法或者getter, setter的工作可以在這之後執行 如果你不需要控制屬性,但需要在屬性設定前後做些處理,可以使用willset和didset,舉例,下面的類中可以確定三角形邊長與方形邊長相同

類中的方法與函數有一個重要差別,函數參數名隻在函數體中使用,但方法的參數名在調用方法時也需要(除了第一個參數),預設不論是調用方法時還是在方法内,方法的參數名都是相同的,你可以指定另一個名稱用于方法内

當使用可選參數時,可以在方法或者屬性操作符前加上(?),如果?前是nil,所有?後面的内容都會忽略,整個表達式的值為nil

使用enum建立枚舉,與類或者其他可命名的類型一樣,枚舉可以定義方法

上面的例子中,枚舉中的原始值類型是int,是以你必須指定第一個原始值,餘下的會按順序指定,你也可以使用浮點數或者字元串作為枚舉的原始類型 使用toraw和fromraw函數轉換枚舉值和原始值

枚舉中的成員數值必須是實際的值,不能通過其他方式設定,實際上對于沒有原始值的情況,你也不能為他設定一個

注意枚舉中的hearts成員引用的兩種方式:當指派給常量hearts時,使用了suit.hearts全名稱,而在switch中,使用 了.hearts,因為self 已經知道是suit,在知道類型時,你可以使用這種縮寫 使用struct建立結構,結構支援許多類似類的功能,比如方法和構造函數,兩者最大的差別是,結構是值傳遞,類為引用傳遞

枚舉成員執行個體可以擁有關聯值,相同枚舉成員可以有不同的關聯值,你可以在建立執行個體時設定關聯值,關聯值與原始值不同,同一個枚舉成員的所有執行個體有相同的原始值,但可以有不同的關聯值 舉個例子,考慮從服務中擷取日升日落的時間,服務可以響應這些資訊或者一些異常資訊

注意從ververresponse中擷取的日升日落的具體數值可以在switch條件中擷取

使用protocol聲明一個協定

類,枚舉,結構都可以使用協定

注意,在simplestructure聲明中使用mutating關鍵詞用于标示這個方法會修改結構,而simpleclass中不需要設定 mutating标志,是因為類中的方法總是會修改這個類 使用extension為一個已存在的類型增加函數,比如新的方法或者計算屬性,你可以使用擴充,保證任意類型具有相同的協定,不管這個類型是從架構還是 類庫中來的

你可以像其他命名類型一樣使用協定名稱,比如,建立一個由類型不同但使用相同協定的對象組成的集合,當你使用這些類型時,可以當做一個協定類型來使用,協定以外的方法将不可用

雖然protocolvalue在運作時是simpleclass類型,但編譯器會以exampleprotocol對待,這意味你可以避免通路協定以外的方法

尖括号中的名稱用于建立一個泛型的函數和類型

也可以用同樣的方式在類,枚舉,結構中使用泛型

在類型名後使用where指定需求清單,比如指定類型必須實作某個協定,或者要求兩種類型相同,或者要求具有某個特定的超類

一般情況下,你可以忽略where,在括号後面簡單的寫一個協定名或者類型,比如,​<code>​&lt;t: equatable&gt;​</code>​ 與​<code>​&lt;t where t: equatable&gt;​</code>​是相同的效果