結果だけでなく過程も見てください

日々の奮闘を綴る日記です。

Swift文法まとめ(適宜更新)

最近、ついに人生初のMacを買いました!!
これで思う存分、スタバでドヤれます!!

で、早速iPhoneアプリを作ってみようとぽちぽちやっているのですが、
SwiftやらCocoaやらXcodeやら、いやもう色々と全く新しい環境だとうまく組めなくてもどかしさMAXですね。

とりあえず、備忘録として覚えにくそうな文法をまとめたいと思います。
例によって適宜更新系記事となります。

環境

MacOS 10.12.2 Sierra
Swift 3.0
Xcode 8.2.1

Tuple

基本的な使い方

StringとIntのTupleの定義、初期化、データの追加は以下の通り。

// 型宣言、初期化
var tupleArray:[(name:String, age:Int)] = [(name:"Joel", age:48), (name:"Airi", age:2)]

// 追加
tupleArray.append((name:"Ellie", age:14))
Tupleの配列で、Tuple中の一部の値がマッチするか検索して、見つかったインデックスを取得する

上の例でいうと、年齢は関係なく名前が"Airi"の人を探して、その配列のインデックスを取得したい!と言った場合のサンプルは以下になります。

if let index = tupleArray.index(where: {$0.name == "Airi"})
{
    print("name:\(tupleArray[index].name)  age:\(tupleArray[index].age)")
}

Swift 3.0以降のfor文

Swift 3.0からは使い慣れたfor文が使えず、代わりに以下の構文を使う必要があるようです。

for index in 0..<array.count
{
    print(array[index])
}

逆順(降順)にカウントしたい場合はこれ!

for index in (0..<array.count).reversed()
{
    print(array[index])
}

C#とかのforeach的な構文はこちら。

for data in array
{
    print(data)
}

配列

変数を定義し,空の配列で初期化する場合。

var intArray : [Int] = []

ディクショナリ

ディクショナリを定義し,空で初期化する場合。

// 人の名前(String)がキー,年齢(Int)がデータのディクショナリ
var personAgeMap: [String:Int] = [:]
値の追加と変更
var personAgeMap: [String:Int] = [:]

// 追加(キーが存在しなければ追加になる)
personAgeMap["Joel"] = 48

// 変更(キーが存在すれば変更になる)
personAgeMap["Joel"] = 14
キーに対応するデータがあるか存在確認したい
var personAgeMap: [String:Int] = [:]

 :

if let age = personAgeMap["Airi"]
{
     // "Airi"という人物の情報が存在する!
}
自作クラスをキーにする場合

例えば以下のようなゲームに出てくるスキルに関するクラスがあって,スキル名,属性,スキルポイントなどのデータを持っている場合。

class SkillInfo
{
    // スキル名
    var strSkillName : String

    // スキルの属性
    var nAttribute : Int

    // スキルポイント
    var nSkillPoint : Int
}

このうちスキル名をキーにしたいと思った場合。以下のコードを追加する。

extension SkillInfo : Hashable
{
    var hashValue : Int
    {
        return self.strSkillName.hashValue
    }
}

// SkillInfo同士を比較する際の==のオーバーロード
func == ( lhs : SkillInfo, rhs : SkillInfo ) -> Bool
{
    return lhs.strSkillName == rhs.strSkillName
}

これで以下のようにディクショナリのキーとして使うことができます。

var skillJobMap : [SkillInfo : JobInfo] = [:]

UserDefaults

こいつにデータを格納しておくと,データを永続化できます。

基本的な使い方

以下のように取得したsettingsに対してデータの取得や設定を行います。

let settings : UserDefaults = UserDefaults.standard
値の設定(Int型の値を設定する場合)

forKeyは「K」が大文字なので注意です。これでしばらく悩んだことがあります。。。
(小文字にすると,Argument labels '(_:, forkey:)' do not match any available overloadsと言われてしまいます)

let point : Int = 40

settings.set(point, forKey:"Joel")
値の取得(Int型の値を取得する場合)
let point : Int = settings.integer(forKey: "Joel")

配列のfilter

配列の中から条件にあったものだけを取り出したいときはfilterを使います。
以下はJobInfoというクラス配列の中から、JobInfoクラスがもつスコアが60より大きいものを選び出して、filteredJobsという変数に格納する例。

// JobInfoクラスの配列
let targetJobs : [JobInfo] = ....

let filteredJobs = targetJobs.filter({
                    (item) -> Bool in return item.score > 60
                })
プライバシーポリシー お問い合わせ