成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

來自蘋果的編程語言——Swift簡介

開發 開發工具 后端
在這里我認為有必要提一下Brec Victor的Inventing on Principle,Swift編程環境的大部分概念都源自于Brec這個演講。

關于

這篇文章簡要介紹了蘋果于WWDC 2014發布的編程語言——Swift。

前言

在這里我認為有必要提一下Brec VictorInventing on Principle,Swift編程環境的大部分概念都源自于Brec這個演講。

接下來進入正題。

Swift是什么?

Swift是蘋果于WWDC 2014發布的編程語言,這里引用The Swift Programming Language的原話:

Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective-C, without the constraints of C compatibility. Swift adopts safe programming patterns and adds modern features to make programming easier, more flexible and more fun. Swift’s clean slate, backed by the mature and much-loved Cocoa and Cocoa Touch frameworks, is an opportunity to imagine how software development works. Swift is the first industrial-quality systems programming language that is as expressive and enjoyable as a scripting language.

簡單的說:

  1. Swift用來寫iOS和OS X程序。(估計也不會支持其它屌絲系統)
  2. Swift吸取了C和Objective-C的優點,且更加強大易用。
  3. Swift可以使用現有的Cocoa和Cocoa Touch框架。
  4. Swift兼具編譯語言的高性能(Performance)和腳本語言的交互性(Interactive)。

Swift語言概覽

基本概念

注:這一節的代碼源自The Swift Programming Language中的A Swift Tour

Hello, world

類似于腳本語言,下面的代碼即是一個完整的Swift程序。

  1. println("Hello, world"

變量與常量

Swift使用var聲明變量,let聲明常量

  1. var myVariable = 42 
  2. myVariable = 50 
  3. let myConstant = 42 

類型推導

Swift支持類型推導(Type Inference),所以上面的代碼不需指定類型,如果需要指定類型:

  1. let explicitDouble : Double = 70  

Swift不支持隱式類型轉換(Implicitly casting),所以下面的代碼需要顯式類型轉換(Explicitly casting):

  1. let label = "The width is " 
  2. let width = 94 
  3. let width = label + String(width) 

字符串格式化

Swift使用\(item)的形式進行字符串格式化:

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

數組和字典

Swift使用[]操作符聲明數組(array)和字典(dictionary):

  1. var shoppingList = ["catfish""water""tulips""blue paint"]  
  2. shoppingList[1] = "bottle of water" 
  3.    
  4. var occupations = [  
  5.     "Malcolm""Captain",  
  6.     "Kaylee""Mechanic",  
  7. ]  
  8. occupations["Jayne"] = "Public Relations" 

一般使用初始化器(initializer)語法創建空數組和空字典:

  1. let emptyArray = String[]()  
  2. let emptyDictionary = Dictionary<String, Float>() 

如果類型信息已知,則可以使用[]聲明空數組,使用[:]聲明空字典。

#p#

控制流

概覽

Swift的條件語句包含ifswitch,循環語句包含for-inforwhiledo-while,循環/判斷條件不需要括號,但循環/判斷體(body)必需括號:

  1. let individualScores = [75431038712]  
  2. var teamScore = 0 
  3. for score in individualScores {  
  4.     if score > 50 {  
  5.         teamScore += 3 
  6.     } else {  
  7.         teamScore += 1 
  8.     }  
可空類型

結合iflet,可以方便的處理可空變量(nullable variable)。對于空值,需要在類型聲明后添加?顯式標明該類型可空。

  1. var optionalString: String? = "Hello" 
  2. optionalString == nil  
  3.    
  4. var optionalName: String? = "John Appleseed" 
  5. var gretting = "Hello!" 
  6. if let name = optionalName {  
  7.     gretting = "Hello, \(name)" 

靈活的switch

Swift中的switch支持各種各樣的比較操作:

  1. let vegetable = "red pepper" 
  2. switch vegetable {  
  3. case "celery":  
  4.     let vegetableComment = "Add some raisins and make ants on a log." 
  5. case "cucumber""watercress":  
  6.     let vegetableComment = "That would make a good tea sandwich." 
  7. case let x where x.hasSuffix("pepper"):  
  8.     let vegetableComment = "Is it a spicy \(x)?" 
  9. default:  
  10.     let vegetableComment = "Everything tastes good in soup." 

其它循環

for-in除了遍歷數組也可以用來遍歷字典:

  1. let interestingNumbers = [  
  2.     "Prime": [23571113],  
  3.     "Fibonacci": [112358],  
  4.     "Square": [1491625],  
  5. ]  
  6. var largest = 0 
  7. for (kind, numbers) in interestingNumbers {  
  8.     for number in numbers {  
  9.         if number > largest {  
  10.             largest = number  
  11.         }  
  12.     }  
  13. }  
  14. largest 

while循環和do-while循環:

  1. var n = 2 
  2. while n < 100 {  
  3.     n = n * 2 
  4. }  
  5. n  
  6.    
  7. var m = 2 
  8. do {  
  9.     m = m * 2 
  10. while m < 100 

Swift支持傳統的for循環,此外也可以通過結合..(生成一個區間)和for-in實現同樣的邏輯。

  1. var firstForLoop = 0 
  2. for i in 0..3 {  
  3.     firstForLoop += i  
  4. }  
  5. firstForLoop  
  6.    
  7. var secondForLoop = 0 
  8. for var i = 0; i < 3; ++i {  
  9.     secondForLoop += 1 
  10. }  
  11. secondForLoop 

注意:Swift除了..還有.....生成前閉后開的區間,而...生成前閉后閉的區間。

函數和閉包

函數

Swift使用func關鍵字聲明函數:

  1. func greet(name: String, day: String) -> String {  
  2.     return "Hello \(name), today is \(day)." 
  3. }  
  4. greet("Bob""Tuesday"

通過元組(Tuple)返回多個值:

  1. func getGasPrices() -> (Double, Double, Double) {  
  2.     return (3.593.693.79)  
  3. }  
  4. getGasPrices() 

支持帶有變長參數的函數:

  1. func sumOf(numbers: Int...) -> Int {  
  2.     var sum = 0 
  3.     for number in numbers {  
  4.         sum += number  
  5.     }  
  6.     return sum  
  7. }  
  8. sumOf()  
  9. sumOf(4259712

函數也可以嵌套函數:

  1. func returnFifteen() -> Int {  
  2.     var y = 10 
  3.     func add() {  
  4.         y += 5 
  5.     }  
  6.     add()  
  7.     return y  
  8. }  
  9. returnFifteen() 

作為頭等對象,函數既可以作為返回值,也可以作為參數傳遞:

  1. func makeIncrementer() -> (Int -> Int) {  
  2.     func addOne(number: Int) -> Int {  
  3.         return 1 + number  
  4.     }  
  5.     return addOne  
  6. }  
  7. var increment = makeIncrementer()  
  8. increment(7
 
  1. func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {  
  2.     for item in list {  
  3.         if condition(item) {  
  4.             return true 
  5.         }  
  6.     }  
  7.     return false 
  8. }  
  9. func lessThanTen(number: Int) -> Bool {  
  10.     return number < 10 
  11. }  
  12. var numbers = [2019712]  
  13. hasAnyMatches(numbers, lessThanTen) 

閉包

本質來說,函數是特殊的閉包,Swift中可以利用{}聲明匿名閉包:

  1. numbers.map({  
  2.     (number: Int) -> Int in  
  3.     let result = 3 * number  
  4.     return result  
  5.     }) 

當閉包的類型已知時,可以使用下面的簡化寫法:

  1. numbers.map({ number in 3 * number }) 

此外還可以通過參數的位置來使用參數,當函數最后一個參數是閉包時,可以使用下面的語法:

  1. sort([153122]) { $0 > $1 } 

#p#

類和對象

創建和使用類

Swift使用class創建一個類,類可以包含字段和方法:

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

創建Shape類的實例,并調用其字段和方法。

  1. var shape = Shape()  
  2. shape.numberOfSides = 7 
  3. var shapeDescription = shape.simpleDescription() 

通過init構建對象,既可以使用self顯式引用成員字段(name),也可以隱式引用(numberOfSides)。

  1. class NamedShape {  
  2.     var numberOfSides: Int = 0 
  3.     var name: String  
  4.    
  5.     init(name: String) {  
  6.         self.name = name  
  7.     }  
  8.    
  9.     func simpleDescription() -> String {  
  10.         return "A shape with \(numberOfSides) sides." 
  11.     }  

使用deinit進行清理工作。

繼承和多態

Swift支持繼承和多態(override父類方法):

  1. class Square: NamedShape {  
  2.     var sideLength: Double  
  3.    
  4.     init(sideLength: Double, name: String) {  
  5.         self.sideLength = sideLength  
  6.         super.init(name: name)  
  7.         numberOfSides = 4 
  8.     }  
  9.    
  10.     func area() -> Double {  
  11.         return sideLength * sideLength  
  12.     }  
  13.    
  14.     override func simpleDescription() -> String {  
  15.         return "A square with sides of length \(sideLength)." 
  16.     }  
  17. }  
  18. let test = Square(sideLength: 5.2, name: "my test square")  
  19. test.area()  
  20. test.simpleDescription() 

注意:如果這里的simpleDescription方法沒有被標識為override,則會引發編譯錯誤。

屬性

為了簡化代碼,Swift引入了屬性(property),見下面的perimeter字段:

  1. class EquilateralTriangle: NamedShape {  
  2.     var sideLength: Double = 0.0 
  3.    
  4.     init(sideLength: Double, name: String) {  
  5.         self.sideLength = sideLength  
  6.         super.init(name: name)  
  7.         numberOfSides = 3 
  8.     }  
  9.    
  10.     var perimeter: Double {  
  11.     get {  
  12.         return 3.0 * sideLength  
  13.     }  
  14.     set {  
  15.         sideLength = newValue / 3.0 
  16.     }  
  17.     }  
  18.    
  19.     override func simpleDescription() -> String {  
  20.         return "An equilateral triagle with sides of length \(sideLength)." 
  21.     }  
  22. }  
  23. var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")  
  24. triangle.perimeter  
  25. triangle.perimeter = 9.9 
  26. triangle.sideLength 

 

注意:賦值器(setter)中,接收的值被自動命名為newValue

willSet和didSet

EquilateralTriangle的構造器進行了如下操作:

  1. 為子類型的屬性賦值。
  2. 調用父類型的構造器。
  3. 修改父類型的屬性。

如果不需要計算屬性的值,但需要在賦值前后進行一些操作的話,使用willSetdidSet

  1. class TriangleAndSquare {  
  2.     var triangle: EquilateralTriangle {  
  3.     willSet {  
  4.         square.sideLength = newValue.sideLength  
  5.     }  
  6.     }  
  7.     var square: Square {  
  8.     willSet {  
  9.         triangle.sideLength = newValue.sideLength  
  10.     }  
  11.     }  
  12.     init(size: Double, name: String) {  
  13.         square = Square(sideLength: size, name: name)  
  14.         triangle = EquilateralTriangle(sideLength: size, name: name)  
  15.     }  
  16. }  
  17. var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")  
  18. triangleAndSquare.square.sideLength  
  19. triangleAndSquare.square = Square(sideLength: 50, name: "larger square")  
  20. triangleAndSquare.triangle.sideLength 

 

從而保證trianglesquare擁有相等的sideLength

調用方法

Swift中,函數的參數名稱只能在函數內部使用,但方法的參數名稱除了在內部使用外還可以在外部使用(第一個參數除外),例如:

  1. class Counter {  
  2.     var count: Int = 0 
  3.     func incrementBy(amount: Int, numberOfTimes times: Int) {  
  4.         count += amount * times  
  5.     }  
  6. }  
  7. var counter = Counter()  
  8. counter.incrementBy(2, numberOfTimes: 7

注意Swift支持為方法參數取別名:在上面的代碼里,numberOfTimes面向外部,times面向內部。

?的另一種用途

使用可空值時,?可以出現在方法、屬性或下標前面。如果?前的值為nil,那么?后面的表達式會被忽略,而原表達式直接返回nil,例如:

  1. let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional   
  2. square")  
  3. let sideLength = optionalSquare?.sideLength 

 

 

optionalSquarenil時,sideLength屬性調用會被忽略。

枚舉和結構

枚舉

使用enum創建枚舉——注意Swift的枚舉可以關聯方法:

  1. enum Rank: Int {  
  2.     case Ace = 1 
  3.     case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten  
  4.     case Jack, Queen, King  
  5.         func simpleDescription() -> String {  
  6.         switch self {  
  7.             case .Ace:  
  8.                 return "ace" 
  9.             case .Jack:  
  10.                 return "jack" 
  11.             case .Queen:  
  12.                 return "queen" 
  13.             case .King:  
  14.                 return "king" 
  15.             default:  
  16.                 return String(self.toRaw())  
  17.         }  
  18.     }  
  19. }  
  20. let ace = Rank.Ace  
  21. let aceRawValue = ace.toRaw() 

使用toRawfromRaw在原始(raw)數值和枚舉值之間進行轉換:

  1. if let convertedRank = Rank.fromRaw(3) {  
  2.     let threeDescription = convertedRank.simpleDescription()  

注意枚舉中的成員值(member value)是實際的值(actual value),和原始值(raw value)沒有必然關聯。

一些情況下枚舉不存在有意義的原始值,這時可以直接忽略原始值:

  1. enum Suit {  
  2.     case Spades, Hearts, Diamonds, Clubs  
  3.         func simpleDescription() -> String {  
  4.         switch self {  
  5.             case .Spades:  
  6.                 return "spades" 
  7.             case .Hearts:  
  8.                 return "hearts" 
  9.             case .Diamonds:  
  10.                 return "diamonds" 
  11.             case .Clubs:  
  12.                 return "clubs" 
  13.         }  
  14.     }  
  15. }  
  16. let hearts = Suit.Hearts  
  17. let heartsDescription = hearts.simpleDescription() 

除了可以關聯方法,枚舉還支持在其成員上關聯值,同一枚舉的不同成員可以有不同的關聯的值:

  1. enum ServerResponse {  
  2.     case Result(String, String)  
  3.     case Error(String)  
  4. }  
  5.    
  6. let success = ServerResponse.Result("6:00 am""8:09 pm")  
  7. let failure = ServerResponse.Error("Out of cheese.")  
  8.    
  9. switch success {  
  10.     case let .Result(sunrise, sunset):  
  11.         let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)." 
  12.     case let .Error(error):  
  13.         let serverResponse = "Failure... \(error)" 

 

 

結構

Swift使用struct關鍵字創建結構。結構支持構造器和方法這些類的特性。結構和類的最大區別在于:結構的實例按值傳遞(passed by value),而類的實例按引用傳遞(passed by reference)。

  1. struct Card {  
  2.     var rank: Rank  
  3.     var suit: Suit  
  4.     func simpleDescription() -> String {  
  5.         return "The \(rank.simpleDescription()) of \(suit.simpleDescription())" 
  6.     }  
  7. }  
  8. let threeOfSpades = Card(rank: .Three, suit: .Spades)  
  9. let threeOfSpadesDescription = threeOfSpades.simpleDescription() 

 

 

#p#

協議(protocol)和擴展(extension)

協議

Swift使用protocol定義協議:

  1. protocol ExampleProtocol {  
  2.     var simpleDescription: String { get }  
  3.     mutating func adjust()  

類型、枚舉和結構都可以實現(adopt)協議:

  1. class SimpleClass: ExampleProtocol {  
  2.     var simpleDescription: String = "A very simple class." 
  3.     var anotherProperty: Int = 69105 
  4.     func adjust() {  
  5.         simpleDescription += " Now 100% adjusted." 
  6.     }  
  7. }  
  8. var a = SimpleClass()  
  9. a.adjust()  
  10. let aDescription = a.simpleDescription  
  11.    
  12. struct SimpleStructure: ExampleProtocol {  
  13.     var simpleDescription: String = "A simple structure" 
  14.     mutating func adjust() {  
  15.         simpleDescription += " (adjusted)" 
  16.     }  
  17. }  
  18. var b = SimpleStructure()  
  19. b.adjust()  
  20. let bDescription = b.simpleDescription 

擴展

擴展用于在已有的類型上增加新的功能(比如新的方法或屬性),Swift使用extension聲明擴展:

  1. extension Int: ExampleProtocol {  
  2.     var simpleDescription: String {  
  3.         return "The number \(self)" 
  4.     }  
  5.     mutating func adjust() {  
  6.         self += 42 
  7.     }  
  8. }  
  9. 7.simpleDescription 

泛型(generics)

Swift使用<>來聲明泛型函數或泛型類型:

  1. func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {  
  2.     var result = ItemType[]()  
  3.     for i in 0..times {  
  4.         result += item  
  5.     }  
  6.     return result  
  7. }  
  8. repeat("knock"4

 

 

Swift也支持在類、枚舉和結構中使用泛型:

  1. // Reimplement the Swift standard library's optional type  
  2. enum OptionalValue<T> {  
  3.     case None  
  4.     case Some(T)  
  5. }  
  6. var possibleInteger: OptionalValue<Int> = .None  
  7. possibleInteger = .Some(100

有時需要對泛型做一些需求(requirements),比如需求某個泛型類型實現某個接口或繼承自某個特定類型、兩個泛型類型屬于同一個類型等等,Swift通過where描述這些需求:

  1. func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {  
  2.     for lhsItem in lhs {  
  3.         for rhsItem in rhs {  
  4.             if lhsItem == rhsItem {  
  5.                 return true 
  6.             }  
  7.         }  
  8.     }  
  9.     return false 
  10. }  
  11. anyCommonElements([123], [3]) 

 

 

Swift語言概覽就到這里,有興趣的朋友請進一步閱讀The Swift Programming Language

接下來聊聊個人對Swift的一些感受。

個人感受

注意:下面的感受純屬個人意見,僅供參考。

大雜燴

盡管我接觸Swift不足兩小時,但很容易看出Swift吸收了大量其它編程語言中的元素,這些元素包括但不限于:

  1. 屬性(Property)、可空值(Nullable type)語法和泛型(Generic Type)語法源自C#。
  2. 格式風格與Go相仿(沒有句末的分號,判斷條件不需要括號)。
  3. Python風格的當前實例引用語法(使用self)和列表字典聲明語法。
  4. Haskell風格的區間聲明語法(比如1..31...3)。
  5. 協議和擴展源自Objective-C(自家產品隨便用)。
  6. 枚舉類型很像Java(可以擁有成員或方法)。
  7. classstruct的概念和C#極其相似。

注意這里不是說Swift是抄襲——實際上編程語言能玩的花樣基本就這些,況且Swift選的都是在我看來相當不錯的特性。

而且,這個大雜燴有一個好處——就是任何其它編程語言的開發者都不會覺得Swift很陌生——這一點很重要。

拒絕隱式(Refuse implicity)

Swift去除了一些隱式操作,比如隱式類型轉換和隱式方法重載這兩個坑,干的漂亮。

Swift的應用方向

我認為Swift主要有下面這兩個應用方向:

教育

我指的是編程教育。現有編程語言最大的問題就是交互性奇差,從而導致學習曲線陡峭。相信Swift及其交互性極強的編程環境能夠打破這個局面,讓更多的人——尤其是青少年,學會編程。

這里有必要再次提到Brec VictorInventing on Principle,看了這個視頻你就會明白一個交互性強的編程環境能夠帶來什么。

應用開發

現有的iOS和OS X應用開發均使用Objective-C,而Objective-C是一門及其繁瑣(verbose)且學習曲線比較陡峭的語言,如果Swift能夠提供一個同現有Obj-C框架的簡易互操作接口,我相信會有大量的程序員轉投Swift;與此同時,Swift簡易的語法也會帶來相當數量的其它平臺開發者。

總之,上一次某家大公司大張旗鼓的推出一門編程語言及其編程平臺還是在2000年(微軟推出C#),將近15年之后,蘋果推出Swift——作為開發者,我很高興能夠見證一門編程語言的誕生。

本文來自:http://zh.lucida.me/blog/an-introduction-to-swift/

責任編輯:林師授
相關推薦

2014-06-04 10:52:56

Swift蘋果iOS

2014-06-10 11:06:54

技術周刊

2015-04-14 14:23:38

蘋果Swift編程語言

2014-07-16 09:41:12

Swift傳統編程

2015-12-04 10:05:09

蘋果編程開源

2014-06-04 10:42:34

Swift蘋果iOS

2014-06-06 09:13:28

SwiftSwift編程

2015-12-25 15:52:50

Linux蘋果編程Swift

2014-06-16 10:02:42

SwiftiOSWWDC

2021-04-13 10:14:12

編程語言PythonJava

2016-04-08 10:29:46

androidswiftjava

2014-07-16 15:10:42

Swift編程語言

2020-03-31 17:12:14

SwiftWindowsLinux

2010-07-28 15:18:10

編程語言函數式編程

2015-01-12 13:04:39

Swift開源項目匯總

2010-03-12 10:48:22

Python編程語言

2009-08-11 08:46:21

Snow動態編程語言

2010-07-19 16:47:54

Perl

2009-02-06 09:08:04

Scala函數語言輕量級

2015-12-07 09:46:26

swift編程開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品欧美精品 | 一二区成人影院电影网 | 久久青青 | 激情欧美一区二区三区中文字幕 | 色婷婷av久久久久久久 | 成人欧美| 日韩成人影院在线观看 | av黄色免费在线观看 | 黄色片视频 | aaaaaaa片毛片免费观看 | 男女av| 精品视频在线播放 | 91就要激情 | 91在线中文字幕 | 免费黄色片视频 | 99视频在线免费观看 | 午夜精品一区二区三区免费视频 | 亚洲综合中文字幕在线观看 | 一区二区不卡 | 国产欧美一区二区三区在线看 | 国产高清免费 | 亚洲精品成人在线 | 国产传媒毛片精品视频第一次 | 99精品久久久久久中文字幕 | 久久精品一二三影院 | 久久久久久九九九九九九 | 一级毛片视频在线观看 | 久久精品亚洲精品国产欧美 | 国产伦精品一区二区三区精品视频 | 免费国产网站 | 国产毛片毛片 | 国产一级在线 | 美女黄18岁以下禁止观看 | 天堂资源 | 亚洲综合久久精品 | 久久精品欧美电影 | 91极品欧美视频 | 99久久成人| 成人在线观看中文字幕 | 日韩免费一区 | 老司机成人在线 |