2016-04-27 36 views
2

私はこれに従いますGenericチュートリアルApplehttps://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.htmlからです。スウィフト一般的な問題

しかし、チュートリアルの最後です。私はこれでいくつかの問題だ:行if allItemsMatch(myStack, arrayOfStrings)

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.") 
} 

を、それは言う:

タイプ の引数リストで 'allItemsMatch' を起動することはできません「(スタック<文字列>、[文字列]ここでは「)

は私のコードです:

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.") 
} 

どこかに迷っていますか?

答えて

2

あなたのStack<Element>構造体をContainerプロトコルに明示的に準拠させることは決してありません。したがって、Swiftの厳格な型の安全性は、暗黙的に準拠していても、Containerプロトコルに準拠するものを期待するパラメータに渡すことを妨げます。

拡張子を使用してStackContainerに明示的に準拠させることができます。例:

+0

ありがとうございます。しかし、なぜまだ "すべての項目が一致しているわけではありませんか?"というメッセージが表示されるのですか? – Khuong

+1

@ khuong291文字列を 'myStack'ではなく' stackOfStrings'にプッシュしているミスタイプが原因でしょうか?その修正によって、私のために働いています。 – Hamish

+0

あなたの助けに感謝します。 – Khuong

関連する問題