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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Xcode

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

Swift

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

Q&A

1回答

1397閲覧

乱数、if文?を使ってもっと簡単にコードを記述したい。

john-crispy

総合スコア6

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Xcode

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

Swift

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

1グッド

0クリップ

投稿2020/03/13 01:08

編集2020/03/13 02:59

前提・実現したいこと

コードが冗長になりすぎているので、もっとシンプルに記述したいです。

イメージ説明

システムとしては

①炎ボタンを押す
→② 1着、2着、3着の部分に1~6の数字の中からランダムに数字を表示(重複付加)

⭕️:1着:1 2着:3 3着:6
×:1着:2 2着:2 3着:4

という流れです。

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

コードが長い。

該当のソースコード

swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // Do any additional setup after loading the view. 9 } 10 11 @IBOutlet weak var first: UILabel! 12 13 14 @IBOutlet weak var second: UILabel! 15 16 17 @IBOutlet weak var third: UILabel! 18 19 20 @IBOutlet weak var answerLabel: UILabel! 21 22 // 選択(数字) 23 var answerNumber = 0 24 25 26 @IBAction func shuffleAction(_ sender: Any) { 27 answerLabel.text = "「博打なんてチョコレート。」" 28 29 // 新しい結果を一時的に格納する変数を設ける 30 var newAnswerNumber = 0 31 32 // ランダムに結果を出すが、前回の結果と異なる場合のみ採用 33 // repeatは繰り返しを意味する 34 repeat { 35 36 // 0~120をランダムに算出(乱数) 37 newAnswerNumber = Int.random(in: 0..<120) 38 39 // 前回と同じ結果のときは、再度、ランダムに数値を出す 40 // 異なる結果のときは、repeat を抜ける 41 } while answerNumber == newAnswerNumber 42 43 // 新しい結果を格納 44 answerNumber = newAnswerNumber 45 46 if answerNumber == 0 { 47 48 // 1,2,3 49 first.text = "1着:1" 50 second.text = "2着:2" 51 third.text = "3着:3" 52 53 } else if answerNumber == 1 { 54 55 // 1,2,4 56 first.text = "1着:1" 57 second.text = "2着:2" 58 third.text = "3着:4" 59 60 } else if answerNumber == 2 { 61 62 // 1,2,4 63 first.text = "1着:1" 64 second.text = "2着:2" 65 third.text = "3着:4" 66 67 } else if answerNumber == 3 { 68 69 // 1,2,5 70 first.text = "1着:1" 71 second.text = "2着:2" 72 third.text = "3着:5" 73 74 } else if answerNumber == 4 { 75 76 // 1,2,6 77 first.text = "1着:1" 78 second.text = "2着:2" 79 third.text = "3着:6" 80 81 } else if answerNumber == 5 { 82 83 // 1,3,2 84 first.text = "1着:1" 85 second.text = "2着:3" 86 third.text = "3着:2" 87 88 } else if answerNumber == 6 { 89 90 // 1,3,4 91 first.text = "1着:1" 92 second.text = "2着:3" 93 third.text = "3着:4" 94 95 } else if answerNumber == 7 { 96 97 // 1,3,5 98 first.text = "1着:1" 99 second.text = "2着:3" 100 third.text = "3着:5" 101 102 } else if answerNumber == 8 { 103 104 // 1,3,6 105 first.text = "1着:1" 106 second.text = "2着:3" 107 third.text = "3着:6" 108 109 } else if answerNumber == 9 { 110 111 // 1,4,2 112 first.text = "1着:1" 113 second.text = "2着:4" 114 third.text = "3着:2" 115 116 } else if answerNumber == 10 { 117 118 // 1,4,3 119 first.text = "1着:1" 120 second.text = "2着:4" 121 third.text = "3着:3" 122 123

以下省略、、、

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

xcode 11.3.1

s.k👍を押しています

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

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

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

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

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

TsukubaDepot

2020/03/13 02:00

コードはマークダウン(```)で囲ってください。見やすくなるだけではなく、コピーして再現するのも楽になります。
guest

回答1

0

追記

ご指摘に基づき回答を変更します。
MasakiHoriさん、ご指摘ありがとうございます。

shuffle()を使うと配列をシャッフルできるので、これをつかってみてください。

swift

1var arr = [Int](1...5) 2arr.shuffle() 3print("1着: (arr[0])") 4print("2着: (arr[1])") 5print("3着: (arr[2])")

追記前:

全ての着順を列記するとなると大変ですよね。

なので、考え方としては着順を入れた配列を用意し、その配列の中身をランダムに入れ替えてあげるという方法がシンプルだと思います。

配列のソートですが、Arrayの拡張という形で次のページに紹介されています。

ただ、モダンな書き方ではなさそうなので、ちょっと書き換えてみました。
また、配列を使った着順表示の例も入れていますので、参考にしていただければと思います。

Array型を拡張しているので、Int型の配列だけでなく、あらゆる配列に適用可能です。

Swift

1// Array型の拡張 2extension Array { 3 mutating func shuffle() { 4 for i in 0..<self.count { 5 let j = Int.random(in: self.indices) 6 if i != j { 7 self.swapAt(i, j) 8 } 9 } 10 } 11} 12 13var count = 0 14 15repeat { 16 // 次の二つは同じ意味 17 // var arr = [1, 2, 3, 4, 5, 6] 18 var arr = [Int](1...6) 19 20 count += 1 21 arr.shuffle() 22 23 print("第(count)レース") 24 print("1着: (arr[0])") 25 print("2着: (arr[1])") 26 print("3着: (arr[2])") 27} while count < 10 28 29// Arrayの拡張なので、配列であれば何でも応用できる 30count = 0 31 32repeat { 33 var arr = ["テンポイント", "ゴールドシップ", "ディープインパクト", "ナリタブライアン", "オグリキャップ"] 34 35 count += 1 36 arr.shuffle() 37 38 print("第(count)レース") 39 print("1着: (arr[0])") 40 print("2着: (arr[1])") 41 print("3着: (arr[2])") 42} while count < 10

投稿2020/03/13 02:00

編集2020/03/13 09:09
TsukubaDepot

総合スコア5086

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

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

john-crispy

2020/03/13 03:06

ありがとうございます! 数値型だけではなく、文字列型にも使うことができる方法を知ることができて本当に感謝です☺️
TsukubaDepot

2020/03/13 09:10

MasakiHoriさん、 ご指摘、ありがとうございます。 確かにご指摘のとおりです。 回答を変更いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問