[Swift] インスタンスを比較する

Swiftでインスタンスの内容を比較する場合、比較したいクラスにはisEqualメソッドを実装します。

import Foundation

class TestObject : NSObject {
    var cnt:Int = 0

    override func isEqual(object: AnyObject?) -> Bool {
        if let val = object as? TestObject {
            return (self.cnt==val.cnt)
        }
        else{
            return false
        }
    }
}

この“isEqual”メソッドは“==” でインスタンス同士を比較した場合に呼び出され、インスタンスの内容が同じであればtrueを、異なっていればfalseを返すように実装します。
では、確認してみましょう。

var obj1 = TestObject()
var obj2 = TestObject()
var obj3 = TestObject()
var obj4 = TestObject()

obj1.cnt = 10
obj2.cnt = 10
obj3.cnt = 20

print(“With ‘==’ operator”)

print(obj1==obj2)
// => true ( cntの値が同じであるためtrueになる )

print(obj1==obj3)
// => false ( cntの値が異なるためfalseになる )

print(obj1==obj4)
// => true ( 参照先が同じであるため、当然trueになる )

また、“===” という演算子もありますが、こちらは左右のインスタンスの参照先が同じかどうかを確認するためのもので、内容までは比較しません。

print(“With ‘===’ operator”)

print(obj1===obj2)
// => false ( 参照先が異なるインスタンスであるためfalse )

print(obj1===obj3)
// => false ( 参照先が異なるインスタンスであるためfalse )

print(obj1===obj4)
// => true ( 同じ参照先を示すインスタンスであるためtrue )

[Swift] 文字列リテラル内で変数や定数を使うには

文字列リテラル内で変数や定数を使うには次のようにします。

let y=2016
let m=7
var d=4
var a=”月”

print(“今日は \(y)年\(m)月\(d)日 \(a)曜日 です”)
// => “今日は 2016年7月4日 月曜日 です”

“文字列\(変数・定数)文字列”
というように、\(変数・定数)と記述することで、文字列リテラル内で変数や定数を使うことができます。

[Mac] Swiftで定数を宣言する

Swiftの定数は次のように宣言できます。

定数は 「let 定数名」で宣言できます。

let a = 10
let b = 0.1
let c = “abc”

「,」で区切って、複数の変数を宣言することも出来ます。

let d=20, e=0.2, f=”def”

型を指定せずに宣言した場合、宣言時に代入された値から推論して型が決められます。

String(a.dynamicType)
// => “Int”
String(b.dynamicType)
// => “Double”
String(c.dynamicType)
// => “String”

上記のように型を指定せずに宣言することもできますが、「let 定数名:型名」というように型を指定して宣言することもできます。

let g:Int = 10
let h:Double = 0.1
let i:String = “ghi”

変数と異なり、定数の値を変更しようとするエラーになります。

// c=”def”
// => Cannot assign to value: ‘c’ is a ‘let’ constant
// 定数の値を変更しようとしたためエラー

変数と同様に、型を指定せず値も代入しない場合は宣言することはできません。

// let j
// => Type annotation missing in pattern
// エラーになる

let k:Int
// これはOK

ここまでで宣言した定数にはnilを代入することはできません。

// k=nil
// => Nil cannot be assigned to type ‘Int’
// 通常の定数にはnilは代入できないのでエラーになる

nilを代入可能にするには、「let 変数名:型名?」と型名の後に?をつける必要があります。

let l:Int?
l=nil

オプショナル変数を通常の変数に戻す(アンラップ)するには「!」演算子を使用します。

let m:String? = “jkl”
print(m)
// => Optional(“jkl”)

//let n:String = m
// => Value of optional type ‘String?’ not unwrapped; did you mean to use ‘!’ or ‘?’?
// オプショナル定数は通常の定数に代入できないのでエラーになる。

let n:String = m!
// !演算子を使って通常の定数に戻す(アンラップ)と代入可能になります。

print(m!)
// => “jkl”
print(n)
// => “jkl”