2017-09-26 10 views
0

すぐに返却と混同します。関数内で値を返すために使用されている場合、私はそれは私がswiftで 'return'の機能と混同しました

func double (value: int) -> Int { 
return value * 2 
} 

を理解するが、私は多くの場合、単に「リターン」が使用されて参照して、このようなものを使用した場合、私は、オプションでガード文のようなものを意味し、理解します

guard let value = value else (
print ("nothing") 
return 
} 

このようなガードステートメントでちょうど「復帰」の目的は何ですか?実際、私はしばしばオプションバインドのガードステートメントだけでなく、私は辞書私は「リターン名」を書かれているにもかかわらず

let info = ["name":"sarah","hometown":"sydney"] 

class UserInfo { 



func getTheName() -> String { 
    guard let name = info["name"] else {return} 

    return name 
} 


} 
xcode error : non-void function should return a value (even though i 
have written 'return name') 

からオプションの文字列を使用する場合、コードを書くとき、私はいつもこの問題を見つけることが、Xcodeはまだ私が値を返されていないことを考えます。それはガード・ステートメントの「帰ってきた」ためですか?

「返却」の目的を迅速に教えていただけますか?それは私のために混乱しています。

+0

、' let'文はブロックの外にスコープされるので、あなたは 'else'ブロック内で使用することはできません。 –

答えて

6

return引数を指定しない場合は、Voidが返されます。この形式のreturnステートメントは、Voidを返す関数でのみ使用できます。

returnステートメントが実行されると、関数は終了し、関数内のコードはそれ以上実行されません。 guardステートメントにreturnがあるので、2番目のreturn nameは実行されません(返す名前がないため、とにかくできませんでした)。そのため、コンパイルエラーが発生します。コンパイラは関数が何かを返すために取ることができるすべてのパスを調べ、それらのパスのすべてが関数のシグネチャが示す通りに返すようにします。

あなたの質問内の関数は、それはあなたの関数のシグネチャで表現契約に違反し、Voidを返すようあなたは、単にguard文でreturnを言うことができないので、それは、Stringを返すと述べています。

あなたはVoidないデフォルト値を返すことができます:

func getTheName() -> String { 
    guard let name = info["name"] else { 
     return "" 
    } 
    return name 
}  

これはゼロ-合体演算子を使用してはるかに簡潔に記述できますが、 return info["name"] ?? ""あなたはまた、(暗黙のうちにVoidを返すように理解されている場合、または明示的な戻り値の型を持っていない、)Voidを返す関数でreturnを使用することができます

だから、のような機能を持つことができます:

func maybePrint(theMessage: String?) -> Void { 
    guard let msg = theMessage else { 
     return 
    } 
    print(msg) 
} 
+0

'nil'も' Void'も "nothing"と同じではありません。 「何もない」はスウィフトでは非常に具体的な意味を持っています。正しいように、これらの関数は '()'(a.k.a. 'Void'型の唯一のインスタンス)を返します。 – Alexander

+0

実際これは間違っています。オプションとして 'nil'を明示的に返す必要があります。私は私の答えを更新しました。ありがとう – Paulw11

0

あなたは正しい軌道に乗っています。

getTheName()内のガードステートメントで、 'return'キーワードは、ガードが失敗した場合に関数自体を終了しようとします。しかし、この関数ではStringを返す必要があり、コンパイラエラーが発生します。ここで

他の部分は、SO同様の質問に答えている:あなたがコントロール転送文を使用してスコープを終了し

ガード力。 そこに利用できる4です:

リターン及び関数/メソッドは、ループ内 を使用することができます継続の両方の出口を投げる(/しばらくの間/リピート-しばらく)ブレークは、ループ内で使用することができます (しばらく/繰り返しのために/ -while)を使用して即時スコープを終了します。ブレークする ラベルを指定すると、複数のスコープを一度に終了できます(たとえば、 はネストループ構造を解除します)。ラベルを使用する場合は、スコープ内で も使用できます。さらに、 によってスコープを終了すると、fatalErrorなどNeverを返す関数を呼び出すことができます。 `guard`文で

Stack Overflow: If the Swift 'guard' statement must exit scope, what is the definition of scope?

関連する問題