2016-04-27 16 views
2

Ich verfolge diese Generic Tutorial von Applehttps://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html.Swift Generic Ausgabe

Aber am Ende des Tutorials. Ich habe ein Problem mit diesem:

var myStack = Stack<String>() 
myStack.push("a") 
myStack.push("b") 
myStack.push("c") 

var arrayOfStrings = ["a", "b", "c"] 

if allItemsMatch(myStack, arrayOfStrings) { 
    print("All items match.") 
} else { 
    print("Not all items match.") 
} 

an der Linie if allItemsMatch(myStack, arrayOfStrings), heißt es:

Kann nicht aufrufen 'allItemsMatch' mit einer Argumentliste vom Typ ‚(Stapel < String>, [Zeichenfolge] ‘)

Hier ist mein Code:

import UIKit 

struct Stack<Element> { 
    var items = [Element]() 
    mutating func push(item: Element) { 
     items.append(item) 
    } 
    mutating func pop() -> Element { 
     return items.removeLast() 
    } 
} 

extension Stack { 
    var topItem: Element? { 
     return items.isEmpty ? nil : items[items.count - 1] 
    } 
    mutating func append(item: Element) { 
     self.push(item) 
    } 
    var count: Int { 
     return items.count 
    } 
    subscript(i: Int) -> Element { 
     return items[i] 
    } 
} 


func findIndex<T: Equatable>(array: [T], _ valueToFind: T) -> Int? { 
    for (index, value) in array.enumerate() { 
     if value == valueToFind { 
      return index 
     } 
    } 
    return nil 
} 

let doubleIndex = findIndex([3.14159, 0.1, 0.25], 9.3) 
let stringIndex = findIndex(["Mike", "Malcolm", "Andrea"], "Andrea") 

protocol Container { 
    associatedtype ItemType 
    mutating func append(item: ItemType) 
    var count: Int { get } 
    subscript(i: Int) -> ItemType { get } 
} 

extension Array: Container {} 

func allItemsMatch< C1: Container, C2: Container where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> (someContainer: C1, _ anotherContainer: C2) -> Bool { 
    if someContainer.count != anotherContainer.count { 
     return false 
    } 
    for i in 0..<someContainer.count { 
     if someContainer[i] != anotherContainer[i] { 
      return false 
     } 
    } 
    return true 

} 

var myStack = Stack<String>() 
myStack.push("a") 
myStack.push("b") 
myStack.push("c") 

var arrayOfStrings = ["a", "b", "c"] 

if allItemsMatch(myStack, arrayOfStrings) { 
    print("All items match.") 
} else { 
    print("Not all items match.") 
} 

Fehle ich irgendwo?

Antwort

2

Sie stimmen Ihre Stack<Element>-Struktur niemals explizit mit Ihrem Container-Protokoll überein. Daher wird Swifts strenge Typsicherheit verhindern, dass Sie es in einen Parameter übergeben, der etwas erwartet, das dem Protokoll Container entspricht (selbst wenn es implizit übereinstimmt).

Sie können Ihre Stack zu Container über eine Erweiterung explizit anpassen. Zum Beispiel:

extension Stack:Container {} 
+0

Danke. Aber warum drucke es immer noch? "Nicht alle Items passen zusammen." ' – Khuong

+1

@ khuong291 Könnte es an dem Tippfehler liegen, wo du deine Strings zu' stackOfStrings' statt zu 'myStack' schubst? Mit dieser Korrektur funktioniert es für mich. – Hamish

+0

Ok. Vielen dank für Deine Hilfe. – Khuong