アップル社の新しいプログラミング言語Swiftの紹介と入門教程

15482 ワード

一、Swiftは何ですか?
Swiftは、アップルがWWTCで2014年に発表したプログラミング言語です。ここでは、The Swift Programming Languageの原語を引用します。
簡単に言うと、SwiftはiOSとOS Xプログラムを書くのに使います。他の潘肯低常Swiftも支持しないと思います。CとObjective-Cの長所を取り入れて、もっと使いやすいです。Swiftは既存のCocoaとCocoa Touchフレームを使用することができる。Swiftはコンパイル言語の高性能とスクリプト言語の相互性を備えています。
二、Swift言語概要
1.基本概念
このセクションのコードは、The Swift Programming LanguageのA Swift Tourに由来します。
1.1.Hello、worldはスクリプト言語に似ています。以下のコードは完全なSwiftプログラムです。

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.2.変数と定数
Swiftはvarを使用して変数を宣言し、letは定数を宣言します。

println("Hello, world")
1.3.タイプ導出
Swiftサポートタイプ導出(Type Inference)ですので、上のコードはタイプを指定する必要がないです。

ar myVariable = 42
myVariable = 50
let myConstant = 42
Swiftは暗黙的なタイプの変換がサポートされていませんので、以下のコードは明示的なタイプの変換が必要です。
let explicitDouble : Double = 70
1.4.文字列フォーマット
Swiftは文字列フォーマットを行います。

let label = "The width is "
let width = 94
let width = label + String(width)
1.5.配列と辞書
Swiftは[]オペレータ宣言配列と辞書を使用する:

let apples = 3
let oranges = 5
let appleSummary = "I have (apples) apples."
let appleSummary = "I have (apples + oranges) pieces of fruit."
一般的に初期化器(initializer)文法を使用して空配列と空辞書を作成します。

var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
タイプ情報が知られている場合は、空の配列を宣言し、空の辞書を宣言します。2.制御フロー
2.1概要
Swiftの条件文はifとswitchを含み、循環文はfor-i、for、whileとdo-whileを含み、循環/判断条件は括弧を必要としないが、循環/判断体(body)は括弧を必要とする:

let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()
2.2空きタイプ
ifとletを組み合わせると、空変数(nullable variable)を簡単に処理できます。空の値には、タイプ宣言の後に追加する必要がありますか?明示的にこのタイプは空です。

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}
2.3フレキシブルなスイッチ
Swiftのswitchは様々な比較操作をサポートしています。
2.4他の循環for-innは、巡回配列を除いても辞書を巡回するために使用できます。

var optionalString: String? = "Hello"
optionalString == nil
var optionalName: String? = "John Appleseed"
var gretting = "Hello!"
if let name = optionalName {
    gretting = "Hello, (name)"
}
whileサイクルとdo-whileサイクル:

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."
}
Swiftは従来のforサイクルをサポートしています。また、結合.(1つの区間を生成する)とfor-innによって同じ論理を実現することもできます。

let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
largest
注意:Swiftは.のほかに.前閉後に開く区間を生成し、前閉後に閉じる区間を生成します。
3.関数とクローズド
3.1関数
Swiftはfuncキーワード宣言関数を使用します。

var n = 2
while n < 100 {
    n = n * 2
}

var m = 2
do {
    m = m * 2
} while m < 100
m
タプルで複数の値を返します。

var firstForLoop = 0
for i in 0..3 {
    firstForLoop += i
}
firstForLoop
var secondForLoop = 0
for var i = 0; i < 3; ++i {
    secondForLoop += 1
}
secondForLoop
変長パラメータを持つ関数をサポートします。

func greet(name: String, day: String) -> String {

    return "Hello (name), today is (day)."

}
greet("Bob", "Tuesday")

関数のネスティングもできます。

func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
getGasPrices()
ファースト・オブジェクトとしては、関数は、戻り値としてもよく、パラメータとしてもよい:

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(42, 597, 12)
3.2クローズド
本質的には、関数は特殊なクローズドであり、Swiftでは{}声明を利用して匿名のクローズドを宣言することができる:

func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()
閉塞タイプが既知の場合、以下の簡略化された書き方が使用されてもよい。
さらに、関数の最後のパラメータがクローズドである場合、以下の構文が使用されてもよい。
4.クラスとオブジェクト
4.1クラスの作成と使用
Swiftは、クラスを使用して、フィールドと方法を含むことができます。

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}

var increment = makeIncrementer()
increment(7)

func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}

func lessThanTen(number: Int) -> Bool {
    return number < 10
}

var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

は、shapeクラスのインスタンスを作成し、フィールドと方法を呼び出します。

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
    })
initによりオブジェクトを構築し、メンバーフィールドをself明示的に参照することも、暗黙的に参照することもできる。

numbers.map({ number in 3 * number })
deinitを使って整理作業を行います。4.2継承と多状態Swiftサポート継承と多状態(override親の方法):
sort([1, 5, 3, 12, 2]) { $0 > $1 }
注意:ここのsimpleDescription方法がoverrideとしてマークされていないとコンパイルエラーが発生します。4.3属性はコードを簡略化するために、Swiftは属性を導入しています。次のperimeterフィールドを参照してください。

class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with (numberOfSides) sides."
    }
}
注意:分配器では、受信値は自動的にnewValueと命名されます。
4.4 willSetとdidSet
EquilateralTriangleのコンストラクタは、次のように動作します。1.サブタイプの属性に値を割り当てます。2.親タイプのコンストラクタを呼び出します。3.親タイプの属性を変更します。属性の値を計算する必要がないが、賦課の前後にいくつかの動作が必要であれば、willSetとdidSetを使用する。
したがって、triangleとスクウェアは同じsideLengthを持つことを保証します。
4.6呼び出し方法
Swiftでは関数のパラメータ名は関数の内部でのみ使用できますが、方法のパラメータ名は内部で使用する以外に外部でも使用できます。例えば、

var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
注意Swiftサポートは、メソッドパラメータとして別名を取ります。上のコードの中で、numberOfTimesは外部に向けて、timesは内部に向けています。
4.7の別の用途
空の値を使用する場合、?方法、属性、または下付きの前面に表示されます。もし前の値はnilです。後の表式は無視されますが、元の表式はそのままnilに戻ります。

class NamedShape {
    var numberOfSides: Int = 0
    var name: String
    init(name: String) {
        self.name = name
    }
    func simpleDescription() -> String {
        return "A shape with (numberOfSides) sides."
    }
}
optional Squareがnilである場合、sideLength属性呼び出しは無視されます。
5.列挙と構造
5.1列挙
enumを使って列挙を作成する――Swiftの列挙が関連する方法に注意する。
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.ジャック:
                return「jack」
            case.Queen:
                return「queen」
            case.King:
                return「king」
        }    }}let ace=Rank.Acell aceRawValue=ace.toRaw()
toRawとfroomRawを用いて、元の(raw)値とエニュメレート・値との間で変換される:

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 test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()
なお、列挙中のメンバー値は実際の値であり、元の値とは必然的に関係がありません。
いくつかの場合、エニュメレーションには意味のあるオリジナル値が存在しない場合があり、直接に元の値を無視することができる。

class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }
    var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
    }
    override func simpleDescription() -> String {
        return "An equilateral triagle with sides of length (sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength
は、関連する方法に加えて、エニュメレーションは、そのメンバーに関連する値をサポートし、同じエニュメレーションの異なるメンバは、異なる関連する値を持つことができる。

class TriangleAndSquare {
    var triangle: EquilateralTriangle {
    willSet {
        square.sideLength = newValue.sideLength
    }
    }
    var square: Square {
    willSet {
        triangle.sideLength = newValue.sideLength
    }
    }
    init(size: Double, name: String) {
        square = Square(sideLength: size, name: name)
        triangle = EquilateralTriangle(sideLength: size, name: name)
    }
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLength
5.2構造
Swiftはstructを使って構造を作成します。構造はコンストラクタと方法のこれらの特性を支持する。構造およびクラスの最大の違いは、構造の例が値によって伝達され、クラスの例が参照によって伝達されることである。

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes times: Int) {
        count += amount * times
    }
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)
5.3プロトコルと拡張プロトコル
Swiftはprotocolを使用してプロトコルを定義します。
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optionalsquare")
let sideLength = optionalSquare?.sideLength
タイプ、エニュメレーションおよび構造はすべてプロトコルを実現できます。

if let convertedRank = Rank.fromRaw(3) {
    let threeDescription = convertedRank.simpleDescription()
}
5.4拡張機能があります。
拡張機能は、既存のタイプに新しい機能(例えば、新しい方法または属性)を追加するために使用され、Swiftはextension宣言を使用して拡張される:

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()
5.5汎型(generaics)
Swiftは<>を使用して汎関数または汎型タイプを宣言します。

enum ServerResponse {
    case Result(String, String)
    case Error(String)
}
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")
switch success {
    case let .Result(sunrise, sunset):
        let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
    case let .Error(error):
        let serverResponse = "Failure... \(error)"
}
Swiftも、クラス、列挙、および構造の中で汎型を使用することをサポートしています。

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()
は、ある汎型タイプがあるインターフェースを実現する必要があるか、またはある特定のタイプから継承されるか、二つの汎型タイプが同じタイプに属するかなど、Swiftはwhereを通じてこれらの需要を説明します。
Swift言語の概観はここまでです。興味のある方はThe Swift Programe ming Languageをもっと読んでください。
これからSwiftに対する個人の感想を話します。
個人的な感想
以下の感想は個人の意見です。ご参考ください。
おでん
私はSwiftに接触して2時間足らずですが、Swiftは他のプログラミング言語の多くの要素を吸収していることが分かりやすいです。これらの要素は含まれていますが、これに限られません。
属性(Property)、空き値(Nullable type)文法と汎型(Generaic Type)文法はC((啱)から由来します。書式スタイルはGoと似ています。Pythonスタイルの現在の例は、構文(selfを使用)とリスト辞書を参照して構文を宣言します。Haskyellスタイルのインターバル宣言文法(例えば1.3,1...3)契約と拡張はObjective-Cから来ています。列挙の種類はJavaに似ています。classとstructの概念はC〓と非常に似ています。
ここに注意してください。Swiftはコピーということではありません。実はプログラミング言語で遊べる柄は基本的にこれだけです。しかもSwiftはどれも私の見たところかなりいい特性です。
そして、このごった煮には、他のプログラミング言語の開発者は、Swiftを知らないというメリットがあります。この点が重要です。
非表示(Refuse implicity)
Swiftはいくつかの暗黙的な操作を除去しました。例えば、陰的なタイプの転換と陰的な方法でこの二つの坑を積み重ねると、綺麗に乾きます。
Swiftの応用方向
Swiftは主に以下の二つの応用方向があると思います。
1.教育
プログラミング教育のことです。既存のプログラミング言語の最大の問題は対話性の奇差であり、それによって学習曲線が急峻になる。Swiftとインタラクティブ性の高いプログラミング環境がこの局面を打破することができると信じています。
ここではBrec VictorのInventing on Principleについて再度言及する必要があります。このビデオを見れば、相互性の強いプログラミング環境が何をもたらすかが分かります。
2.アプリケーション開発
既存のiOSとOS XはObjective-Cを使用していますが、Objective-Cは煩雑で曲線が急な言語です。Swiftが既存のObj-Cフレームと簡易的な相互操作インターフェースを提供できれば、多くのプログラマがSwiftを投げます。同時に、Swiftの簡単な文法も相当数の他のプラットフォームの開発者を持ってきます。
つまり、前回ある大手会社がプログラム言語とプログラミングプラットフォームを大々的に出したのは2000年(マイクロソフトがC〓〓を発売した)以来15年近く経って、アップルがSwiftを出しました。開発者として、プログラミング言語の誕生を確認することができてとても嬉しいです。