はじめに
エラー処理について3にパターン分けて記事を投稿する。
①Optional型 >>>>> 成功時は値を返し、失敗時はnilを返す
②Result型 >>>>> 成功時は値を返し、失敗時はエラーの値(詳細)を返す
③do-catch文によるエラー処理
今回は①について記載する。
詳細
- 成功時は値を返し、失敗時はnilを返す
Swift
//①Optional<wrapped>型 >>>>> 成功時は値を返し、失敗時はnilを返す
struct User {
let id: Int
let name: String
let email: String
}
//対応するユーザーが存在しない場合はnilを返すようにする処理
//戻り値は構造体のUserオプショナル
func findUser(byID id: Int) -> User? {
//配列usersにUserを格納
let users = [
//User.initのinitは省略できる
User(id: 1,
name: "山田太郎",
email: "yamada@google.com"),
User(id: 2,
name: "鈴木小太郎",
email: "suzuki@gmail.com")
]
//in usersのusersはUser型
for user in users {
//後ろのidはfindUserの引数
if user.id == id {
return user
}
}
//対応するユーザーが存在しない場合はnilを返すようにする処理
return nil
}
//idを定義
let id = 1
//findUser関数をを使用する、findUserに該当するidでなかったらエラー処理する
//定数idを代入して該当するかしないかチェック(エラーチェック)
if let user = findUser(byID: id) {
print("Name: \(user.name)") // idの値は1のため、こちらが出力される
} else {
print("Error: User not fond")
}
- init? 失敗可能イニシャライザでエラー処理
- 該当しなかったらインスタンス化させない
Swift
//おまけ
struct User {
let id: Int
let name: String
let email: String
init?(id: Int, name: String, email: String) {
//文字@によって2分割する判定
let components = email.components(separatedBy: "@")
guard components.count == 2 else {
return nil
}
self.id = id
self.name = name
self.email = email
}
}
if let user = User(id: 0, name: "佐藤太郎", email: "satou.gmail.com") {
print("Username:\(user.name)")
} else {
print("Error: Invalid data") // 引数emailが@によって分割されていないため、こちらのError: Invalid data が出力される
}
おわりに
修正箇所等あればご指摘ください
参考記事
[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者:片岡 巌
出版社:技術評論社
印刷/製本:日経印刷株式会社
開発環境
- Xcode-13.4.1
- Swift version 5.7