2016-07-13 29 views
29

Nel mio progetto (scritto in Swift 3) voglio recuperare l'indice di un elemento dalla matrice usando il metodo indexOf(_:) (esistente in Swift 2.2), ma non riesco a trovare alcuna sostituzione per quello.Sostituzione per il metodo indexOf dell'array (_ :) in Swift 3

C'è qualche buona sostituzione per quel metodo in Swift 3 o qualcosa che agisce in modo simile?

Aggiornamento

ho dimenticato di dire che voglio cercare in oggetto personalizzato. Nel completamento del codice non ho avuto alcun suggerimento durante la digitazione di 'indexof'. Ma quando provo a ottenere l'indice di tipo build come Int, il completamento del codice funziona e potrei usare il metodo index(of:).

+1

'indice (di:)'? Sintassi diversa, stessa funzionalità. Suggerimento: utilizzare il completamento del codice. – vadian

+0

È necessario leggere e aggiungere ai segnalibri questo documento: https://github.com/apple/swift-evolution/blob/master/proposals/0006-apply-api-guidelines-to-the-standard-library.md – Moritz

+0

Sì provato. Ma il completamento del codice non mostrava il metodo 'index (of:)' per l'oggetto personalizzato. Mostra solo per i tipi di build. – krlb

risposta

46

indexOf(_:) è stato rinominato in index(of:) per i tipi conformi a Equatable. È possibile uniformare le tue tipi di Equatable, non è solo per i tipi built-in:

struct Point: Equatable { 
    var x, y: Int 
} 

func == (left: Point, right: Point) -> Bool { 
    return left.x == right.x && left.y == right.y 
} 

let points = [Point(x: 3, y: 5), Point(x: 7, y: 2), Point(x: 10, y: -4)] 
points.index(of: Point(x: 7, y: 2)) // 1 

indexOf(_:) che prende una chiusura è stato rinominato in index(where:):

[1, 3, 5, 4, 2].index(where: { $0 > 3 }) // 2 

// or with a training closure: 
[1, 3, 5, 4, 2].index { $0 > 3 } // 2 
+1

Questioni equivalenti :). – Senry

1

non ha funzionato per me in Swift 3 XCode 8 fino a quando ho dato alla mia classe un extension.

Ad esempio:

class MyClass { 
    var key: String? 
} 

extension MyClass: Equatable { 
    static func == (lhs: MyClass, rhs: MyClass) -> Bool { 
     return MyClass.key == MyClass.key 
    } 
} 
1

Questo ha funzionato per me in Swift 3 senza un'estensione:

struct MyClass: Equatable { 
    let title: String 

    public static func ==(lhs: MyClass, rhs: MyClass) -> Bool { 
     return lhs.title == rhs.title 
    } 
}