0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SwiftのrandomElement()で詰まった話

Last updated at Posted at 2022-09-07

概要

普段Pythonを仕事で使用していて、動的言語しか経験のない私がモバイルアプリを作りたくてSwiftを学習した際に型のせいで詰まったところを共有したいと思います。

基礎的なところなので、初心者以外の人にはあまりお役に立てないかもしれません。

環境

ツール バージョン
xcode 13.4.1

詰まった内容

下記のような課題がありました。

  • 全てのアルファベットを格納した配列型のデータからランダムに6つの文字列を抽出してパスワードを作成するシステムを作成してください

上記の課題に対して私は下記のコードを実装しました。

let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",]
var password = ""
for _ in 1...6 {
    password += alphabet.randomElement()
}
print(password)

すると下記のようなエラーが発生しました。

Value of optional type 'String?' must be unwrapped to a value of type 'String'

どうやらオプションタイプのalphabet.randomElement()Stringに確定させないといけないようです。

あれ?randomElement()って配列型のデータからランダムでデータを取ってくるのではないのか?

alphabetは文字列しか含まれていないし、なぜだ?

というわけで、公式ドキュメントで情報を集めに行きました。

すると返り値の記載で下記のように記載がありました。

A random element from the collection. If the collection is empty, the method returns nil.

上記によるとnilも返ってくる可能性があることがわかりました。

つまりrandomElement()の返り値はOptional型nilを含む可能性がある)ということです。

先ほどのコードをもう一度見てみましょう。

let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",]
var password = ""
for _ in 1...6 {
    password += alphabet.randomElement()
}
print(password)

ここではpasswordString型alphabet.randomElement()Optional型になります。

よって、型が異なり異なる型同士は演算できないので先ほどのエラーが発生しました。

これを踏まえて先ほどのコードを下記のように修正すると文字列を生成することができました。

let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",]
var password = ""
for _ in 1...6 {
    password += alphabet[Int.random(in: 0...25)]
}
print(password)

// => mkcves

まとめ

動的言語では起こらないエラーに遭遇しましたが、エラー内容はいたって初歩的なことでした。

メソッド等が何の型を返すのかということもしっかり気にした上で実装していかないと静的言語は難しいということを実感しました。

少しでも私のような初心者の役立てていただけたら嬉しいです。

ありがとうございました。

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?