最近、ついに人生初のMacを買いました!!
これで思う存分、スタバでドヤれます!!
で、早速iPhoneアプリを作ってみようとぽちぽちやっているのですが、
SwiftやらCocoaやらXcodeやら、いやもう色々と全く新しい環境だとうまく組めなくてもどかしさMAXですね。
とりあえず、備忘録として覚えにくそうな文法をまとめたいと思います。
例によって適宜更新系記事となります。
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 })