質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

760閲覧

Xcode12から return文 が不要になった件

Capibara

総合スコア34

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

2クリップ

投稿2020/10/22 12:59

編集2020/10/22 13:01

Xcode11までは、次のようなコードを書くと、「return文が無いよ」というエラーになっていましたが、Xcode12からは問題なく動くようになりました。
おそらくなんらかの仕様変更が入ったものと思われますが、どんな変更が入ったのかご存知の方おられますでしょうか?
いろいろ探してみたのですが、そのようなドキュメントを見つけられませんでした。

import SwiftUI struct ContentView: View { var body: some View { let name = "World" Text("Hello, (name)!") } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

これは、Swift5.3のFunction Builderの機能強化によるものだと思います。

https://www.youtube.com/watch?v=LKFVcc_uC60

上記のYoutube動画の17分頃の「local let and var」の説明がその部分です。

従来のSwift5.2のFunction Builderは、buildBlockに指定できるものを複数並べるか、それをif文で切り分けるくらいしかできませんでした。従来でもletで変数を宣言した場合は、最後にreturnをつけて、そのreturnの戻りにViewを記述すればビルドが通っていましたが、それが通る理由は、returnを記述することでFunction Builderを適用する部分が最後のreturn行だけに限定されるようになる(そのため、returnより前の部分は通常のSwift文法で自由に書ける)ためだったと思います。

returnを記述しない場合は、ブロック全体がFunction Builderの適用対象になり、Swift5.2はその中ではif文くらいしか使えませんでしたが、Swift5.3では、Function Builderの中に書けることが強化され、いろいろできるようになったようです。なお、冒頭の動画では23分頃にfor文も使えるように説明されていますが、これはbuilder側でbuildArrayを定義する必要があるようで、SwiftUIのViewBuilderではそこまでサポートされていません。

今のところSwiftUIのViewBuilderで新たにできるようになったのは、let, var, switch - case, if let, if #available といったところだと思います。if文しか使えなかったのに比べると色々できるようになったように見えますが、 print や別の関数呼び出しや代入のような通常のSwiftの文はやはり使えず、なんでもできるようになったわけではありません。(おそらく思想的に、なんでもできるようにするつもりもないのだろうと思います。)

この機能の開発状況の情報は、次のURLにあるようです。
https://forums.swift.org/t/function-builders-implementation-progress/32981

投稿2020/10/23 15:00

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Capibara

2020/10/24 01:03

とても丁寧な説明ありがとうございました。 疑問が解けてすっきりしました。
guest

0

returnを省略すると、
ブロックの最後の行がreturn文であると解釈されます。
Xcodeというより、Swiftのバージョンによるものです。
Xcode12より、その仕様に完全対応したのでしょう。

また、省略記法に関しては、下記が参考になるかと。

Swift クロージャ(Closures)の記法 - Qiita

投稿2020/10/22 16:41

miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Capibara

2020/10/22 21:46

ご回答ありがとうございます。 参考で紹介して頂いた記事を見ると、クロージャー内では 2つ以上文があるとreturn が省略不可とあり、実際、Xcode12に付属のSwiftで試してみてもクロージャーの動きは変わってないように見えます。 しかし、質問した例では2行の文があるにもかかわらず、returnが省略可能となっているのが解せません。 おそらく、なんらかの条件があるかと想像しているのですが、「ブロックの最後の行がreturn文であると解釈される」という事を説明している文献をご存知でしたら、お教えいただけませんでしょうか?
miyabi_takatsuk

2020/10/23 00:05

クロージャの場合は、 単行で、 今回のように、変数定義のブロックでは、 複数行が可能とか、その違いのような気がします。
miyabi_takatsuk

2020/10/23 02:45

いや、違うな・・・・。 回答しておいてすみません、 もう少しこちらでも調査いたします。
Capibara

2020/10/24 01:03

コメントいただきありがとうございます。 おかげで、新たな気付きを得ることができました。 お時間を取らせてしまってすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問