2016-03-18 5 views
0

私は、関数を呼び出すときに正しいインデックスと間違ったインデックスを入れてテストし、2番目のifステートメントだけが問題を引き起こしていることを認識しました。両方のif文が非常に似ているので、私は何をすべきか分かりません。私は問題を見つけることができません。私は2番目のif文をリセットしてchangeThisを番号1に変更しました。どちらも動作しませんでしたので、私はaWordCharacters.countメソッドに戻しました...助けてください!「不良命令」エラーが発生するのはなぜですか?

// to define a custom index, and asign it a new custom position 

func rearangeALetter(aWord: String, var changeThis: Int, var withThis: Int) -> (codedWord:String, fromTo: String) { 
    let aWordCharacters: [Character] = wordSeperator(aWord) 
    let changeCharacter: Character = aWordCharacters[changeThis] 
    var finalWord: [Character] = aWordCharacters 

    finalWord.removeAtIndex(changeThis) 

    if withThis > aWordCharacters.count { 
     withThis = 0 
    } 

    if changeThis > finalWord.count { 
     changeThis = aWordCharacters.count 
    } 

    finalWord.insert(changeCharacter, atIndex: withThis) 

    let returnWord = combineWords(finalWord) 

    return (returnWord, "Letter number \(changeThis + 1) has been switched with letter number \(withThis + 1)") 
} 

rearangeALetter("Hello", changeThis: 101, withThis: 100) 

答えて

0

配列内の有効なインデックス範囲は0からcount-1までで、0から数えません。

if changeThis > finalWord.count { 
    changeThis = aWordCharacters.count - 1 
} 

をしかし、それは言った、私はあなたが達成しようとしているものは本当にわからないんだけど、私はそれに誓うません。私はあなたがする場合は、2番目を変更する必要があると思います。実際にはchangeThisをインデックスに使用しないため、実際にクラッシュする可能性はありません。

ああ、あなたはまた、あなたがインデックスを使用する前に境界チェック(両方のif文)を実行する必要があります。

func rearangeALetter(aWord: String, var changeThis: Int, var withThis: Int) -> (codedWord:String, fromTo: String) { 
    let aWordCharacters: [Character] = wordSeperator(aWord) 

    if changeThis > finalWord.count { 
     changeThis = aWordCharacters.count 
    } 

    let changeCharacter: Character = aWordCharacters[changeThis] 
    var finalWord: [Character] = aWordCharacters 

    finalWord.removeAtIndex(changeThis) 

    if withThis > aWordCharacters.count { 
     withThis = 0 
    } 

    finalWord.insert(changeCharacter, atIndex: withThis) 

    let returnWord = combineWords(finalWord) 

    return (returnWord, "Letter number \(changeThis + 1) has been switched with letter number \(withThis + 1)") 
} 
+0

が、これは多くのことができますので、私は初心者です、ありがとうございました。私は単に文字列を操作する機能を作って、自分の知識を迅速にテストしています。それが他の提案を思い起こさせたら、もう一度ありがとう! – KeithFrazier98

関連する問題