細かいところのメモをちょくちょく更新していこうと思います。
for文でindexも受け取る
for文普通に回すだけならとても手軽ですが、やはりindexがほしい場合があります。
そんなときはこんなふうに書きます。
enumerate.swift
var someList: String[] = ["hoge", "fuga", "foo", "bar"]
for (index, value) in someList.enumerate() {
println("index: \(index), value: \(value)")
}
SwiftでなんちゃってSingletonクラス
こちらの記事(Swift でシングルトン)を参考にしました。
記事によると、static
の初期化はdispatch_once
が使われているとのこと。
singleton.swift
// なんちゃってSingletonクラスを定義
class SingletonClass {
// クラス変数を定義(getterのみ)
class var sharedInstance: SingletonClass {
struct Singleton {
static let instance = SingletonClass()
}
return Singleton.instance
}
// コンストラクタ
init() {
println("Singleton has been created!")
}
}
// 使う
var s: SingletonClass = SingletonClass.sharedInstance
メソッド定義で、ラベルと変数名を分ける
通常、メソッドは以下のように宣言、使用します。
method.swift
func someMethod(hoge: String, fuga: Int) -> () {
println("Arguments are \(hoge) + \(fuga)")
}
someClass.someMethod("sample", fuga: 5)
しかし、ラベルと変数名を分けて、以下のように宣言することもできます。
(そしてその場合、第一引数にもラベルを指定することができるようになります)
method2.swift
func someMethod2(label1 hoge: String, label2 fuga: Int) -> () {
println("Arguments are \(hoge) + \(fuga)")
}
someClass.someMethod2(label1: "sample", label2: 5)
SwiftでSelectorを使う
Objective-Cで言うところの@selector(hoge:)
です。
Swiftでは、なんのことはない、普通にStringを渡してやればいいようです。
button.swift
var button = UIButton(frame: CGRectMake(0, 0, 150, 30))
button.addTarget(self, action:"doTouch:" forControlEvents: UIControlEvents.TouchUpInside)
演算子のオーバーロード(Operator functions)
Swiftには演算子のオーバーロードの仕組みがあります。
以下のように、@infix
をつけて、関数名にあたるところに、オーバーロードしたい演算子を書きます。
そして演算子の左右にくる値を取り、実際の処理を行います。
// 例えばVector2Dを作る場合
struct Vector2D {
var x = 0.0, y = 0.0
}
@infix func + (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: (left.x + right.x), y: (left.y + right.y))
}
クラス周りのメモ
プロパティの変化を監視する(KVOのようなもの)
プロパティ定義の際に、willSet
とdidSet
を入れ子にして定義する。
class SomeClass {
var hoge: Int {
willSet {
// hogeがセットされる前に呼ばれる
println("willSet was called.")
println(self.hoge)
}
didSet {
// hogeがセットされた直後に呼ばれる
println("didSet was called.")
println(self.hoge)
}
}
init(hoge: Int) {
// 初期化時は、上記の監視は呼ばれない
self.hoge = hoge
}
}
var someClass: SomeClass = SomeClass(hoge: 5)
someClass.hoge = 10
クラスメソッドを定義する
クラスメソッドにしたいメソッドの宣言に、class
キーワードを付ける
class-method.swift
class SomeClass {
// クラスメソッド定義
class func doSomething() {
println("hogehoge")
}
}