2016-10-16 3 views
0

Ich versuche, 3.Swift 3.0 Konvertierung - enthält (_ :) in Sammlung

Hier einige Probleme mit contains(_:) von Collection ein Projekt von Swift 2.3 Swift zu konvertieren:

extension Collection { 
    subscript (safe index: Index) -> Iterator.Element? { 
     return indices.contains(index) ? self[index] : nil 
    } 
} 

Der Fehler Missing argument label 'where:' in call ist

ich habe where:, aber jetzt, ein anderer Fehler angezeigt:

Cannot convert value of type 'Self.Index' to expected argument type '(_) throws -> Bool'

Von Swift 3.0 Sprache Führung scheint es, dass es ohne Fehler funktionieren sollte:

if favoriteGenres.contains("Funk") { 
    print("I get up on the good foot.") 
} else { 
    print("It's too funky in here.") 
} 

Antwort

2

In Swift 3, die indices Eigenschaft Collection ist kein Collection, sondern nur eine IndexableBase & Sequence. Welche hat keine contains(_:) Methode, sondern nur contains(where:) Methode.

(. Von der erzeugten Header)

associatedtype Indices : IndexableBase, Sequence = DefaultIndices<Self> 

public var indices: Self.Indices { get } 

Sie können so etwas schreiben müssen:

extension Collection { 
    subscript (safe index: Index) -> Iterator.Element? { 
     return (startIndex..<endIndex).contains(index) ? self[index] : nil 
    } 
} 

Oder sonst kann man contains(_:) Methode für Sequence where Iterator.Element : Equatable, rufen Sie mit dem Hinzufügen von einige Einschränkungen:

extension Collection 
where Indices.Iterator.Element: Equatable, Index == Indices.Iterator.Element 
{ 
    subscript (safe index: Indices.Iterator.Element) -> Iterator.Element? { 
     return indices.contains(index) ? self[index] : nil 
    } 
} 

Beide arbeiten für einfache Arrays:

let arr = [1,2,3] 
print(arr[safe: 3]) //->nil 
print(arr[safe: 2]) //->Optional(3) 

Aber ich bin nicht sicher, welche die Sicherheit im Allgemeinen ist.