2016-12-21 1 views
0

これは、以前に発表されたSwift 2.0ソリューションのSwift 3.0バージョンです。BNR本Swift Ch 22、Gold Challenge-A Swift 3.0のソリューション

import Cocoa 


func findAll<T: Equatable, C: Collection>(items: C, itemToFind: T) -> [C.Index]? where C.Iterator.Element == T { 

    guard items.contains(itemToFind) else { 
    return nil 
    } 

    var result = Array<C.Index>() 
    var index = items.startIndex 
    for item in items { 
    if item == itemToFind { 
     result.append(index) 
    } 
    index = items.index(after: index) // index = index.successor() 
    } 
    return result  
} 



print("\nList the Indicies within 'items' of where 'itemToFind' was found") 


let Indexes = findAll([items: [5, 3, 7, 3, 9], itemToFind: 3)     // result expected: [1, 3] 
let Indexes = findAll([items: ["c", "a", "b", "c", "a"], itemToFind: "b")  // result expected: [1, 4] 


let stringChars = ["Hello, playground!".characters] 
let stringIndexes = findAll(items: stringChars, itemToFind: Character("l"))   // result expected: [2, 3, 8] 

コンパイラが私を助けていない、報告されたエラーのみが、私はどちらか書いたところ、「期待される 『』区切りのみprint文の後に4文に欠けている。 は、誰もが指摘することができます文句を言いますルーチン誤っやミス理解どのように入力するコールのパラメータを「のfindAll」関数に?

答えて

0
let Indexes = findAll([items: [5, 3, 7, 3, 9], itemToFind: 3) 
        ^

この行は私がマークした場所での浮遊正方形のブラケットを持っている。それを削除します。

let Indexes = findAll([items: ["c", "a", "b", "c", "a"], itemToFind: "b") 

同じ問題、同じ場所。また、なぜ[1, 4]が返されると思うのか分かりません。もしitemToFind: "c"を渡したら私は同意しますが、"b"は位置[2]に一度しか表示されません。

(また、あなたがIndexes以外の変数の何かに名前を付ける必要があります - その名は、前の行からすでに使用されています。)

let stringChars = ["Hello, playground!".characters] 

は、あなたはそれを知っているだろう、このラインはdoesnのの角かっこのが必要です! charactersは既にCharacterView(findAll()が動作するための配列のように十分動作する)です。別のレベルの配列にラップする必要はありません。

0

これはスウィフト3.0

import Cocoa 


func findAll<T: Equatable, C: Collection>(items: C, itemToFind: T) -> [C.Index]? where C.Iterator.Element == T { 

    guard items.contains(itemToFind) else { 
    return nil 
    } 

    var result = Array<C.Index>() 
    var index = items.startIndex 
    for item in items { 
    if item == itemToFind { 
     result.append(index) 
    } 
    index = items.index(after: index) // index = index.successor() 
    } 
    return result 

    // Another approach: 
    // return items.indices.filter { items[$0] == itemToFind } 

} 

print("\nList the Indicies within 'items' of where 'itemToFind' was found") 


let Indexes1 = findAll(items: [5, 3, 7, 3, 9], itemToFind: 3)     // result: [1, 3] 
print(Indexes1!) 
let Indexes2 = findAll(items: ["c", "a", "b", "c", "a"], itemToFind: "c")  // result: [0, 3] 
print(Indexes2!) 



func offsetValue(input: String.CharacterView, position: String.CharacterView.Index) -> Int { 
    let offset = input.distance(from: input.startIndex, to: position) 
    return offset 
} 

var i = 0 
let stringChars = "Hello, playground!".characters 
let stringIndexes = findAll(items: stringChars, itemToFind: Character("l"))  // result: [2, 3, 8] 
print("[", terminator: "") 
for stringIndex in stringIndexes! { 
    let stringIndexInt = offsetValue(input:stringChars, position: stringIndex) 
    print("\(stringIndexInt)", terminator: "") 
    i += 1 
    if i < (stringIndexes?.count)! { 
    print(", ", terminator: "") 
    } 
} 
print("]") 
で動作します