水夫と戯れて

Appleの開発言語Swiftのことを書く。公開されている範囲内で書いています。文章に「?」が含まれているところはよく理解していないところ。

列挙

目次>

Enumerations

enum SomeEnumeration {
    // enumeration definition goes here
}

caseが使える

enum CompassPoint {
    case North
    case South
    case East
    case West
}

このようにもかける

enum Planet {
    case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

switch〜caseで条件分岐するときに使える

一旦初期化した後は、.Southのように、enum名は省略できる。 caseには、追加してwhereで条件を付加することができる

var directionToHead = CompassPoint.West
        
        directionToHead = .West
        
        switch directionToHead {
            case .North:
                println("北へ向かいます")
            case .South:
                println("南へ向かいます")
            case .East:
                println("東へ向かいます")
            case .West:
                println("西へ向かいます")
        }
Associated Values?
Raw Values?

関数

目次>

よくある関数みたい

func sayHello(personName: String) -> String {
    let greeting = "Hello, " + personName + "!"
    return greeting
}

引数

ラベルなしでもよい。

引数がない場合

func sayHello(){

}

引数がある場合

func sayHello(personName: String) {

}

引数と返り値がある場合

func sayHello(personName: String) -> String {
    let greeting = "Hello, " + personName + "!"
    return greeting
}

ラベル名と引数が同じ名称なら # を頭につけてやる func sayHello(#name: String, #age: Int) -> Int {}

ラベル:型で指定。複数ある場合は , でつなぐ 引数なしの場合は( ) (personName: String) (start: Int, end: Int) ( )

外部引数名?

外部に出す名前と別に関数内部で使う名前をつけることができる

ショートハンド外部引数名?

外部引数名と同じ名前をつけたい場合は引数名の先頭にに#をつける (#string: String, #characterToFind: Character)

デフォルトの引数値

デフォルトの値を指定できる (s1: String, s2: String, joiner: String = " ")

可変の引数

...を型の後につける (numbers: Double...)

固定と可変の引数

デフォルトでは引数は固定値。可変にしたい場合はラベルの前にvarをつける (var string: String, count: Int, pad: Character)

In-Out引数

引数としても、返り値としても使うような場合? ラベルの前にinoutをつける (inout a: Int, inout b: Int)

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)

返り値

-> 返り値の型 で指定 返り値なしの場合は->はいらない。

-> String

複数の値を返すことができる。これは便利。 -> (vowels: Int, consonants: Int, others: Int)

関数タイプ

同じ引数、同じ返り値を持つ関数を変数に入れることができる? 他の関数の引数にも使うことができるようだ 返り値にも使うことができるようだ

入れ子になった関数

条件分岐

目次>

if

( )はいらない。 ( )があってもいい。 ( )をつけないのが基本の流儀

        var myMember = 1
        if myMember <= 3 {
            println("メンバーは3人以下です。")
        }  

if〜else

        myMember = 5
        
        if myMember <= 3 {
            println("メンバーは3人以下です。")
        }else{
            println("メンバーは3人以下ではありません。")
        }  

if〜else if〜else

switch〜case

caseに文字列が使えたりする breakはいらないみたいだけど(あってもいいみたい) caseに追加して条件をつけることができる case .South where i == 1 みたいな

enum NSEventTypeの要素を分岐させる場合、NSEventType.LeftMouseDownとしても良いし、省略して .LeftMouseDown とすることもできる。

var type:NSEventType = event.type
        switch type {
        case .LeftMouseDown :
            NSLog("LeftMouseDown")
            break
        case .LeftMouseUp :
            NSLog("LeftMouseUp")
        default :
            break
        }
タプル

caseにタプル)?が使える こんなの

case (-2...2, -2...2):

ポイント値の範囲などに使える

case 2, 3, 5, 7, 11, 13, 17, 19:のように複数の値を設定することができる

func function004()  {
        let integerToDescribe = 5
        var description = "The number \(integerToDescribe) is"
        switch integerToDescribe {
        case 2, 3, 5, 7, 11, 13, 17, 19:
            description += " a prime number, and also"
            fallthrough
        default:
            description += " an integer."
        }
        println(description)
        // prints "The number 5 is a prime number, and also an integer.”
        
    }

もっと範囲が広い場合は ... で範囲を指定することができる

        case 4...9:
        case 10...99:
        case 100...999:
        case 1000...999_999:
バリューバインディング
where
制御文
  • continue すぐにループの先頭にジャンプする
  • break すぐにループを終了する
  • fallthrough そのまま次へ通す。Cでbreakを使わない場合と同じ?
  • return
ラベル文

複数のネスト化されたループがある場合に使用 ループに名称を付けることができて、breakするときに、どこに戻るかを明記できる。

ループ

目次>

for

普通にループ変数を設定してインクリメントするような使い方

for var index = 0; index < 3; ++index {
    println("index is \(index)")
}
for in

基本は for i in 1...5{}

ループ変数を使う必要がない場合は省略できる for _ in 1...5{}

Obj-Cと同様、配列の要素を列挙して使うことができる

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    println("Hello, \(name)!")
}

辞書の場合も、「キー」「値」の順で変数に取り込むことができる

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    println("\(animalName)s have \(legCount) legs")
}
while
do-while



    
    
  

辞書(Dictionary)

目次>

Objective-CでDictionaryと呼ばれているもの。 他の言語では連想配列とか

    func function001() ->String {
        var members = [
            "鈴木さん": "部長",
            "山田さん": "課長",
        ]
        members["鈴木さん"] = "嘱託"
        
        return members["鈴木さん"]!
    }
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        NSLog("現在の役職 %@",function001())
    }

素数は .count プロパティ(?)

func function003()  {
        var myMembers = [
            "鈴木さん": "部長",
            "田中さん": "次長",
            "山田さん": "課長",
        ]
        myMembers["鈴木さん"] = "嘱託"
        
        for (theName, theTitle) in myMembers {
            println("\(theName): \(theTitle)")
        }
        
    }
//=>メンバーは3人です。

for in で(key,value)として値が渡される

var myMembers = [
            "鈴木さん": "部長",
            "田中さん": "次長",
            "山田さん": "課長",
        ]
        myMembers["鈴木さん"] = "嘱託"
        
        for (theName, theTitle) in myMembers {
            println("\(theName): \(theTitle)")
        }
/*
=>
山田さん: 課長
鈴木さん: 嘱託
田中さん: 次長
*/
オプショナル

nilになる可能性がある場合はオプショナル指定

func function004(){
        let myMembers = ["ant":6,"snake":0,"cheetah":4]
        let possibleLegCount: Int? = myMembers["aardvark"]
        
        if possibleLegCount == nil{
            println("Aardvarkは見つかりませんでした。")
            
        }
    }
NSDictionary

swiftのDictionaryではなくNSDictionaryを作ることも必要な場合があるので

    //NSApplication orderFrontStandardAboutPanelWithOptions
    @IBAction func function015(sender: AnyObject) {
        NSLog("orderFrontStandardAboutPanelWithOptions")
        let anApplication = MyApplication.sharedApplication()
        //アバウトパネルの情報表示用NSDictionaryを設定
        let panelDic:Dictionary<String, String> = ["Version" : "1.1", "Copyright" : "satoshi oomori"];
        //表示用
        for key in panelDic.keys{
            println("\(key) : \(panelDic[key])");
        }
        //アバウトパネルを表示
        anApplication.orderFrontStandardAboutPanelWithOptions(panelDic)
    }

配列

目次>

配列は [ ] でくくってやる

配列は0から始まる。 配列xxxxのN番めの要素をYYYYYに置き換える場合は、xxxx[N]=YYYYYとする。

辞書はこちら

var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
NSLog("---\(shoppingList[1])---")

=>---bottle of water---

letで配列を作成しても要素は置き換わる

let shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
NSLog("---\(shoppingList[1])---")

=>---bottle of water---

配列の要素の型を指定したいときには型をつけてやる。 let theArray = String;

要素の追加

配列の要素を追加するときは += で末尾に追加する

func function003()  {
        var anArray = ["aaa","bbb","ccc"]
        anArray += "ddd"
            println("\(anArray)")

    }
//->[aaa, bbb, ccc, ddd]
要素の修正

配列の要素の番号を指定して変更する

 func function004()  {
        var anArray = ["aaa","bbb","ccc"]
        anArray[0] = "AAA"
        println("\(anArray)")
        
    }

//=>[AAA, bbb, ccc]