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

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

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

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

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

Swift

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

Q&A

解決済

1回答

765閲覧

swiftで書籍の通りに記述しているが警告が出る

wesker.alice

総合スコア45

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/05/10 05:03

編集2020/05/10 05:54

前提・実現したいこと

swiftで基礎を学んでいる初学者です。
将来的にiphoneアプリを作成したいと考えていますが、基礎知識があまりにも少な過ぎるので基礎から学んでいます。
書籍「詳細!Swift iPhoneアプリ開発入門ノート: iOS 12+Xcode 10対応」を見ながら打ち込んでいます。

警告の箇所を解決したいのですが、解決方法が分からず困っています。
原因はある程度分かっているのですがどう記述したらよいかというところで止まってしまいました。

発生している問題・エラーメッセージ

swift

1bigger = bの部分で下記の警告 2Will never be executed 3警告をクリックすると下記の文が表示されます。 41. Condition always evaluates to true 5

まず警告文「Will never be executed」をそのままコピペで検索してみました。

「if文の条件式が常に真(true)か偽(false)になるようなコードを書いてしまうと、このような警告が発生する原因となる。」

とあり、
2つ目の警告文「1. Condition always evaluates to true」を読み解くと確かに記述しているコードは真しか常に選ばれてないなと感じました。
しかし、この警告を解決するためにどう記述し直せば良いかが分からず困っています。

該当のソースコード

swift

1//if文 a、bを比較して大きな値をbiggerに代入する 2 func ifBigger(){ 3 let a = 57 4 let b = 45 5 var bigger : Int 6 if a>b { 7 bigger = a 8 } else { 9 bigger = b 10 } 11 print("aは(a) bは(b) biggerは(bigger)") 12 }

試したこと

elseの部分をelse if a<bに変更してみましたが変わらずでした
もしかしたらバージョンが異なるので記述方法が古い可能性

補足情報(FW/ツールのバージョンなど)

マシンの環境
macOS Catalina Version 10.15.3
Xcode Version 11.4
Swift version 5.1.3

書籍のバージョン
Xcode Version 10
Swift version 4.2

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

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

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

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

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

hoshi-takanori

2020/05/10 05:51 編集

それって黄色く表示されてると思いますが、黄色は警告で、エラーは赤です。 エラーだと実行できませんが、警告はそのまま実行できます。 たとえば将来的には a と b をユーザーに入力してもらうんだけど、とりあえず今は適当な値を代入して、その先の処理を書きたい、みたいなことがプログラミングをしているとよくあります。そういう場合に、警告は出ているけど実行してその先の処理が正しいことを確認できる、というのは重要です。もちろん、実際のプロダクト開発であれば後で a と b に目的の値を入力する処理を書く必要がありますが、それを忘れないために警告を出している、ということでもあります。
wesker.alice

2020/05/10 05:55

すみません、ご指摘ありがとうございます。 エラーではなく警告でした。 質問の文章をエラーから警告に修正させていただきました。
hoshi-takanori

2020/05/10 06:02

書籍の意図としては、「if 文の挙動を理解してもらうためのサンプルコードを示したけど、a と b の値が決めうちだと実際にはどちらかしか実行されなくて if 文の意味はない。それは分かってるけど、a や b をユーザーに入力してもらうにはもっと難しいコードを書かないといけないので、今の段階では警告はとりあえず無視して実行して、その代わりに a や b の値をいろいろな値に変えて実行して、if の挙動を理解してくださいね。」って感じだと思います。
wesker.alice

2020/05/10 06:07

なるほどですね。 ランダム要素を含ませると警告が出にくい・回避できる事を教えて頂きました。 プログラミングとはとても奥が深いですね。 日々勉強になります。
guest

回答1

0

ベストアンサー

swift

1let a = 57 2let b = 45

ですので if a > b { しか成り立ちません。

従って、

swift

1 } else { 2 bigger = b 3 }

は絶対に到達しないコードとなり、表記のようなエラーとなってしまいます。


例えば、Int.random(in:)のようなメソッドを覚えておくと、実行ごとに異なる結果が得られる練習問題も作れますので、覚えておいて損はないとおもます。

playground を使えば余計なコードを書く必要もないので便利です。

swift

1import Foundation 2// Playground で実行できます。 3 4let a = Int.random(in: 1...10) 5let b = Int.random(in: 1...10) 6 7print("変数 a の値: (a)") 8print("変数 b の値: (b)") 9 10let bigger: Int 11 12if a > b { 13 print("変数 a の値が大きい") 14 bigger = a 15} else if b > a{ 16 print("変数 b の値が大きい") 17 bigger = b 18} else { 19 print("2つの変数 a, b の値は同じ") 20 bigger = a 21} 22 23print("大きい方の値は (bigger) です") 24 25// 他の制御構文の練習にも使える 26switch bigger { 27case ...4: 28 print("大きい方の値は 5 未満です") 29case ...9: 30 print("大きい方の値は 10 未満です") 31default: 32 print("10以上の値が代入されました") 33}

投稿2020/05/10 05:17

編集2020/05/10 05:32
TsukubaDepot

総合スコア5086

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

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

TsukubaDepot

2020/05/10 05:19

> しかし、このエラーを解決するためにどう記述し直せば良いかが分からず困っています。 一つは、aとbに代入している値を入れ替えてみることです。
wesker.alice

2020/05/10 05:39 編集

ご回答ありがとうございます。 aとbを入れ替えてみたところ、今度は常に偽のみという逆の結果のエラー「1. Condition always evaluates to false」が表示されました。 let a = Int.random(in: 1...10) let b = Int.random(in: 1...10) でエラーが解決されました。 Int.random(in:)メソッド、教えて頂きありがとうございます。 非常に勉強になりました。
TsukubaDepot

2020/05/10 05:38

値を入れ替えた、つまり let a = 45 let b = 57 であれば、a > b は成り立たない、つまり「Conditions always evaluates to false(条件式は常に false と評価されます)」となります。
wesker.alice

2020/05/10 05:56 編集

常に真、常に偽にならない方法→ランダムに設定で解決。毎回どちらかの可能性があるということでエラーを回避できるということですね。 「Int.random(in:)」 大変素晴らしいメソッドを教えていただきありがとうございます。
TsukubaDepot

2020/05/10 05:51

値を固定して実行している関係上、コンパイラが実行前に真理値を判定し、エラー(正確には Warning)を出してしまうことは致し方がないと思います。 C言語の scanf/printf や他の言語の同様の関数とは違い、Swift はコンソールベースで簡単にインタラクティブなサンプルコードを書くのはちょっと大変ですから、randomメソッド(Int型以外にもあります)を使って、少しでもランダム要素を含ませた方がいいかもしれませんね。
wesker.alice

2020/05/10 06:04

なるほどですね。 たしかに値を固定してしまうと真理値でどちらかが必ず選ばれない警告が出るということですね。 ランダム要素、警告を回避できる方法の一つとして、また一つ成長できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問