Swift(objcから来て)に慣れるだけの簡単なことをしています - guard
ステートメントとswitch
ステートメントを使用してリンクリストに目的のノードを返したい。私は明らかにelse
節が巨大であるため(私のswitch文が保存されている)、guard
のステートメントを悪用しています。おそらく、私はswitch
という文も必要ないかもしれませんが、ちょっと上のほうを整理するだけです。ガードステートメントを誤って使用して、nilチェックを無効にする
次のように私の古いコードは次のとおりです。guard
文で置き換えられ
func getValue (atIndex index: Int) -> T {
if count < index || index < 0 {
print ("index is outside of possible range")
}
var root = self.head
// if var root = self.head {
if index == 0 {
return (self.head?.value)!
}
if index == count-1 {
return (self.tail?.value)!
}
else {
for _ in 0...index-1 {
root = root!.next!
}
}
return root!.value
}
(ただし、ガード体が通過落下しないことをコンパイラエラーを取得) - 私の問題は私の関数の戻りいるので、返すようにするものですタイプは<T>
(任意のタイプ)です。
func getValue (atIndex index: Int) -> T {
guard (count < index || index < 0) else {
switch true {
case index == 0:
if let head = self.head {
return head.value
}
case index == count-1:
if let tail = self.tail {
return tail.value
}
default:
if var currentNode = head {
for _ in 0...index-1 {
currentNode = currentNode.next!
}
return currentNode.value
}
}
}
}
私は希望インデックスが範囲外であると言って私のguard
文の外print
ステートメントを追加したいのですが、私はまた、タイプT
の関数の最後に何かを返す必要があります。問題は、私のguard
とswitch文の外で、私は何も返さないということです。
私はあなたが警備員の利用状況を誤解したと思います。ガードに入れた条件は、*成功*の条件です。あなたがガードのボディに置くものは、*失敗*時に実行するコードであり、制御の転送( 'return'、' throw'など)につながなければなりません。したがって、成功コードはガードの直後に来なければなりません。また、 'true'を切り替えることは意味をなさない。確実に' index'を切り替えることは、それがあなたが比較しているのでより意味をなさないだろうか?また 'T 'は何ですか?あなたの関数は一般的ではありません、それはクラスジェネリックですか? – Hamish
インデックスを切り替えようとしたところ、「Bool型の式パターンが 'Int'型の値と一致しません」というエラーメッセージが表示されました。リンクされたリストクラスは一般的です - インスタンス化するとき、私は各ノードの値をどのタイプのオブジェクトにするかを指定します。 –
あなたの 'index'の値を' case0'、 'case_count-1'のようにする必要があります。 – Hamish