あなたの質問からわかるように、上記のどれも実際にObjective-Cへの接続はありません。あなたの例にはいくつかの問題がありますが、意図したとおりに動作しないようにしています。
MyObject
には初期化子がありません(Swift 2.2以降、少なくとも1つの初期化子を含める必要があります)。
obj1
,obj2
...とは何ですか?これらのメソッドをクラス/構造体型と扱います。の型がMyObject
であるとします。
上記を固定した場合意図したとおりに、あなたのコードの実際のフィルタリングの一部が動作しますが(あなたがfilter() {... }
から()
を省略することができることに注意してください)、例えば:フィルタリングの代替案として
enum ObjectType{
case type1
case type2
case type3
}
class MyObject {
var type : ObjectType
let id: Int
init(type: ObjectType, id: Int) {
self.type = type
self.id = id
}
}
let array = [MyObject(type: .type1, id: 1),
MyObject(type: .type2, id: 2),
MyObject(type: .type3, id: 3),
MyObject(type: .type2, id: 4),
MyObject(type: .type3, id: 5)]
let type2Array = array.filter { $0.type == .type2}
type2Array.forEach { print($0.id) } // 2, 4
列挙ケースに直接入力すると、rawValue
タイプの列挙を指定し、代わりにこれに一致させることができます。例えば。 Int
rawValue
を使用すると、(w.r.t. rawValue
のフィルタリングに加えて)あなたの列挙の場合の範囲のパターンマッチングを実行できます。
enum ObjectType : Int {
case type1 = 1 // rawValue = 1
case type2 // rawValue = 2, implicitly
case type3 // ...
}
class MyObject {
var type : ObjectType
let id: Int
init(type: ObjectType, id: Int) {
self.type = type
self.id = id
}
}
let array = [MyObject(type: .type1, id: 1),
MyObject(type: .type2, id: 2),
MyObject(type: .type3, id: 3),
MyObject(type: .type2, id: 4),
MyObject(type: .type3, id: 5)]
/* filter w.r.t. to rawValue */
let type2Array = array.filter { $0.type.rawValue == 2}
type2Array.forEach { print($0.id) } // 2, 4
/* filter using pattern matching, for rawValues in range [1,2],
<=> filter true for cases .type1 and .type2 */
let type1or2Array = array.filter { 1...2 ~= $0.type.rawValue }
type1or2Array.forEach { print($0.id) } // 1, 2, 4
Xcode 7.3を使用していますか? –