概要
普段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)
ここではpassword
はString型、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
まとめ
動的言語では起こらないエラーに遭遇しましたが、エラー内容はいたって初歩的なことでした。
メソッド等が何の型を返すのかということもしっかり気にした上で実装していかないと静的言語は難しいということを実感しました。
少しでも私のような初心者の役立てていただけたら嬉しいです。
ありがとうございました。