【じっくりSw1ftUI 16】Essentials第5章〜Playgroundで遊ぼう②変数とか定数とかデータ型とかオプショナルとか
さてと、前回
で、Plyagroundの基本的な動かし方はやったって感じなので、
SwiftプログラミングのSyntax(文法)
に入ってく〜〜〜!
早速、第5章をじっくり読んでく🕺
まずは
Objective-Cから始まるSwiftの歴史〜〜〜!
って感じで、Cが出来た40年くらい前から、大元になるプログラミング言語は存在してたんだけど、、、
iOS、macOS、watchOS、tvOS
なんかに
より親和性の高く、モダンでシンプルで分かりやすい言語
👉Swiftを開発し、さらにSwiftUIが開発された経緯
みたいなもんを書いてる
=歴史だね👀
で、その後に、今から今後、数章の内容を学ぶなら、
ちゃんとPlaygroundの環境で動かしながらやるやで!
って当たり前のことを当たり前に書いていて〜〜〜、バイナリについて、コンピュータは
0と1の2進数やっでね
32ビットがベースになってるだけだから、
64ビットでも基本は変わらんでね
って感じで、データ型の導入に話が移ってるね👀
で、数字を何かの引数に格納しようとする場合、
var number5_1 = 20
てな感じで代入してあげて、コンパイルするとどんな結果がコンパイラに表示されるか、、、。
まあ、実はバイナリとしては違うんだが。。。を例えにして、ここで大事なのは、
Swiftがサポートしてる共通なデータ型に親しむこと
って書いてんね👀そんでそこから、
Integer
Floating
Bool
Character Data Type
String Data Type
マルチライン(すでにやった複数行)
特殊文字(=エスケープ文字)
変数
定数
変数と定数の宣言
アノテーションと型推論
タプル
オプショナル型
型のキャスト
って感じで話をした後で、まとめに入ってんね👀
てことでここからは、
個人的に、じっくり読みながら実際にPlaygroundで動かしてみよ🕺
まずは、
Integer型
数を管理できるデータ型
8、16、32、64ビットにも対応してるぞ👀
UInt8、UInt16、UInt32、UInt64なんかもあるぞ
それぞれ最小値と最大値の間の値までアクセスが出来る
てな感じで書いていて、コードとしては、
各データ型の最小値、最大値の調べ方
を引き合いに出してんね👀ここは、
.minと.max
を使って、
//Int8の最小〜最大
print("Int8は最小:\(Int8.min)〜最大:\(Int8.max)")
//Int16の最小〜最大
print("Int16は最小:\(Int16.min)〜最大:\(Int16.max)")
//Int32の最小〜最大
print("Int32は最小:\(Int32.min)〜最大:\(Int32.max)")
//Int64の最小〜最大
print("Int64は最小:\(Int64.min)〜最大:\(Int64.max)")
てな感じのコードで、実行すると
まあ、この数値型の範囲については、日本語の本なんかだと、Swiftに限らずこの
.minとか.maxのメソッドを教えず
に、
Int8は、~128から127まで
みたいな感じで、最小値と最大値だけを書いてるものなんかを目にしてて、しかもそれを
覚えていて当然
みたいな感じで、それを覚えてることに悦に浸ってる駆け出しさんなんかも見受けるんだけど。別に、そんなもん覚えなくても、
Playground開いて、メソッド使えば簡単に調べられる
し、オイラたちは、
モノ作ってんであって、記憶力ゲームやってんじゃない
んだから、
この調べ方を身につけとくだけで覚えなくていい
って認識することの方が全然、重要。いくらInt64の最小最大範囲を覚えたところで、
SwiftUIでワクワクするものをゼロから作れないなら、
大して意味はない
からね
👉C言語の初期のポインタなんかをやってるわけじゃないんだし💦👀
さてと、次に
Floating型
ここは、
FloatとDoubleから2つのタイプのFloating Point型を提供
Floating型にもいくつかのタイプがある(32とか16とか)
コードで実際に検証してみると、、、
//Float16
var float5_2_1: Float16 = 5432.1234
//Float32
var float5_2_2: Float32 = 5432.1234
//Float64
var float5_2_3: Float64 = 5432.1234
//Float16出力
print("Float16だと、\(float5_2_1)")
//Float32出力
print("Float32だと、\(float5_2_2)")
//Float64出力
print("Float64だと、\(float5_2_3)")
てな感じで、
ここは、もし実際に組み込むときに型をFloat型にしちゃうと、
計算結果とかで影響がありそうだから気をつけねば
(まあ、アプリでキャリブレーションまでやることは少ないかもだから影響は少ないかもだけど、、、💦)
Bool型
条件なんかに当てはまっているかを、真(true:1)と偽(false :0)
ちょっとまだ今までで出てきてない、定数とかif文を使ってコードで遊ぶと、、、
//Bool型
//定価
var price: Double = 10000
//消費税
let customerTax: Double = 1.10
//税込価格
var sumPrice: Double = price * customerTax
//真偽フラグ
var over10000: Bool = true
//もし、1万円以下なら
if sumPrice <= 10000 {
print("税込価格は、\(sumPrice)円")
//falseを返せ
print(!over10000)
} else {
print("税込価格は、\(sumPrice)円")
//trueを返せ
print(over10000)
}
てな感じで、
ま、実際にSwiftUIでさらに作り込むなら、
定価入力ボックスなんかを作って、計算ボタンをタップすると、10000円を超えるかどうかの判定結果を出す
商品一覧の画像を並べておいて、チェックボックスにチェックが入ってるモノを裏側で自動で合計して、10000円を終えたら、警告を出す
みたいなアプリで利用できるかな🧐と💦👀
文字列型(CharacterとString)
ま、ここはそんなに難しく考えず
Character:””の中が1文字の文字列で処理されるもの
String:””の中が2文字以上の文字列で処理されるもの
てイメージで十分かな💦👀実際、コードで〜〜〜〜
//文字列型
//1文字
let male5_4_1: Character = "男"
let female5_4_1: Character = "女"
print("日本の銭湯は一般的に\(male5_4_1)湯と\(female5_4_1)湯に分かれています。")
//Unicodeで旧Twitterの会社名を表示
let oldTwitter5_4 : Character = "\u{0058}"
print("旧Twitterは\(oldTwitter5_4)に変わりました。")
//複数文字
var companyName5_4 : String = "facebook"
let newCompanyName5_4 : String = "Meta"
print("会社名は\(companyName5_4)")
companyName5_4 = newCompanyName5_4
print("会社名は\(companyName5_4)")
で実際に実行してみると〜〜〜
マルチライン(複数行)
引数名 = """
(複数行に亘る文字列)
"""
ってだけなので、すでに
でも紹介してるからサンプルはそっちを見てね〜〜〜
特殊文字(エスケープシーケンス)
ま、ここも色々な他のプログラミング言語と共通なんだけど、代表的なモノをSwiftで使う例を紹介してんね👀
\n:改行
\r:キャリッジリターン
\t:水平タブ
\\:バックスラッシュ
\":ダブルクォーテーション
\':シングルクォーテーション
\u{nn}:1バイトのユニコード
\u{nnnn}:2バイトのユニコード
\u{nnnnnn}:4バイトのユニコード
って感じかな💦さっきの文字列操作のコードを使って
//特殊文字の使用例
//1文字
let male5_5_1: Character = "男"
let female5_5_1: Character = "女"
//改行文字
print("日本の銭湯は一般的に\(male5_5_1)湯と\n\(female5_5_1)湯に分かれています。")
//Unicodeで旧Twitterの会社名を表示
let oldTwitter5_5 : Character = "\u{0058}"
//水平タブ
print("旧Twitterは、\n\t\(oldTwitter5_5)\tに変わりました。")
てな感じのコードで実行すると、、、
⭐️エスケープ文字は、
SQLの基本文法
正規表現
と並ぶくらいどのプログラミング言語でも共通なところが多いし、しっかり理解しておかないと、
パラメータ化して文字列をマルチラインで
グローバル引数にする
なんて時に意外と困る人をどこの職場でも見てきてるから、簡単だと頭で理解したつもりになって読み飛ばすと後で涙目になる人多いからね〜〜〜
💃気をつけてね🕺
変数
さっきの
//複数文字
var companyName5_4 : String = "facebook"
let newCompanyName5_4 : String = "Meta"
print("会社名は\(companyName5_4)")
companyName5_4 = newCompanyName5_4
print("会社名は\(companyName5_4)")
みたいに、
処理の途中で、他の値に引数の値が変わる = 変数
定数
さっきの
//消費税
let customerTax: Double = 1.10
みたいに、
処理の中で変わらず定まった値 = 定数
まあ、消費税もシステムとかアプリの寿命が長いと、いつの間にか変わることもあるかもしれないけど、少なくとも
処理を流す間に消費税率がコロコロ変わることはない
から、基本、
定数で表現で問題ない
かな💦システムの寿命が長くて20年とか30年の間に、消費税の値が変わるのであれば、
//じっくり16で追加
//消費税
//let customerTax: Double = 1.03
//let customerTax: Double = 1.05
//let customerTax: Double = 1.08
let customerTax: Double = 1.10
てな感じで用意しておいて、
消費税をパラメータ化させておけば、管理しやすいかなと。ディクショナリ型なんかで、キーとバリューでキー毎に値をセットして、、、みたいな感じで、パラメータを厳密に定義して振り分けるってのが実務的だったりはするんだけど、
この章はまだ入り出し、そこまでやったちゃうとキリがなくなっちゃうのでここでは割愛します〜〜〜
変数と定数の宣言
変数の場合 : 頭にvarを付けて宣言
定数の場合 : 頭にletを付けて宣言
てだけだね👀さっきのコードも、
//定価:変数
var price: Double = 10000
//消費税:定数
let customerTax: Double = 1.10
//税込価格:変数
var sumPrice: Double = price * customerTax
//真偽フラグ:変数
var over10000: Bool = true
って感じになるんだよね〜〜〜要は、
処理の開始から終了までに
値が変わるか変わらないか
で判断すればOK。まあ、Javascriptなんかだと
定数:const
変数 : let
て感じで、Swiftでは定数で使うletが変数で使われるみたいなこともあるんだけど、、、
変わる可能性がある = variable
って考えたら、変数をvarにしてる方が
よりモダンで直感的に書きやすい
👉Swiftがモダン
って意味がわかるとは思う、、、💦
アノーションと型推論
ま、要は、これまでのコードではしっかり
let male5_6_1: Character = "男"
let female5_6_1: Character = "女"
print("日本の銭湯は一般的に\(male5_6_1)湯と\(female5_6_1)湯に分かれています。")
てな感じで、
引数(変数か定数): データ型 = ~
で、どの型を使うかわかるように明示してたんだけど、Swiftには、
型推論
ってのがあって、明示的にやらなくても、
let male5_6_1 = "男"
let female5_6_1 = "女"
print("日本の銭湯は一般的に\(male5_6_1)湯と\(female5_6_1)湯に分かれています。")
なんだけど、、、
//定価
var price5_6_2: Double = 10000
//消費税
let customerTax: Double = 1.10
//税込価格
var sumPrice5_6_2: Double = price5_6_2 * customerTax
//真偽フラグ
var over100005_6_2: Bool = true
//もし、1万円以下なら
if sumPrice5_6_2 <= 10000 {
print("税込価格は、\(sumPrice5_6_2)円")
//falseを返せ
print(!over100005_6_2)
} else {
print("税込価格は、\(sumPrice5_6_2)円")
//trueを返せ
print(over100005_6_2)
}
の例で明示を外して
//定価
var price5_6_2 = 10000
//消費税
let customerTax = 1.10
//税込価格
var sumPrice5_6_2 = price5_6_2 * customerTax
//真偽フラグ
var over100005_6_2 = true
//もし、1万円以下なら
if sumPrice5_6_2 <= 10000 {
print("税込価格は、\(sumPrice5_6_2)円")
//falseを返せ
print(!over100005_6_2)
} else {
print("税込価格は、\(sumPrice5_6_2)円")
//trueを返せ
print(over100005_6_2)
}
ってやっちゃうと、、、
ってなるので、こーゆーときは、、、
//税込価格
var sumPrice5_6_2 = Double(price5_6_2) * customerTax
てな感じで、型を揃えてあげると、、、
まあ、明示するか推論するかはその職場とか個人のやり方ひとつなんで、別に
明示してる方がやりやすいなら、明示すればいい
明示が面倒なら、型推論でやればいい
んだけど、この前、
でも書いたとおり、
コードは、可読性=読みやすさが命
だから、
あるコードは、明示しているのにコメントなし。
他のコードは、明示してない
みたいな感じで、その時々でコードの書き方をその時の気分でやってると数ヶ月後とかに自分で見返した時にも、
なんでここだけ明示してるんだっけ?👀
みたいなことになるから、
コードの書き方は、プロジェクト単位でもいいので
データタイプを明示するかしないか
を最初から統一して、
やるならやる、やらないならやらない
にしておいた方がいい。ま、
レガシーなプログラミング言語とかデータベースエンジニア気取りな人とかは、無駄に
データタイプばかりに拘って、明示するのが当たり前って感じで、逆に型推論って概念がそもそもないから
型推論、静的プログラミング言語、オブジェクト指向言語
ってゆー
Swiftの最大の旨み
を、
レガシー時代のやり方で完全に潰すようなことをやっちゃう人も多い
からね。さっき見せた対処方法でもわかるとおり、
型をいちいち明示して書いてなくても、
何かエラー警告が出た時に、
型名(引数)で囲んでやるだけ
で簡単に対処が出来たでしょ👀
もちろん、定数の値を処理の途中で、他の値なんかにしようとすると、、、
てな感じでエラーになるから気を付けてね👀
タプル
Swiftで一番シンプルでパワフルな特徴のひとつ
異なる型の複数の値をひとつの引数の中に、放り込める
例えばコードで、
//タプル
var tuple5_7_1 = (10.0, "M_Kaku堂")
var kakuString5_7_1 = tuple5_7_1.1
print(kakuString5_7_1)
を実行すると、、、
次に、タプルの一番目の要素に他の値を入れてみよう
tuple5_7_1.0 = 12
print(tuple5_7_1)
を追加して〜〜〜
の教材の中でも紹介してるプログラミングを早く理解するコツなんだけど、
左辺=右辺
って数式があった場合、
算数:左辺と右辺は等しい(左から右)
プログラミング:左辺に右辺の値を代入する(右から左)
って意味で動きになるから、気をつけてね〜〜〜👀💦
んでさらに、、、ここでちょっと動かないてか間違ってそうなコードが潜んでそうなんだけど、そこはスキップして〜〜〜タプルの各要素にキーワードをSQLとかと同じ感じで付けてみる〜〜〜
(インデックスってゆーた方がSQL的には伝わるのか、、、🧐)
var tuple5_7_2 = (count:10.0,name:"M_Kaku堂")
print("タプルの名前要素は、\(tuple5_7_2.name)")
オプショナル型
まあ、ここは他のプログラミング言語の
Null(入れ物はあるけど、中身が空っぽな状態)
👉トイレットペーパー置きはあるけど芯すらない状態
↔️0:トイレットペーパー置きに芯まであるけど紙がない状態
みたいなもんで、Swiftだと、
nil
って表現される。んで、引数までは宣言できて、データ型も(型推論含めて)一応、あるんだけど、処理の結果、
中身が空っぽな値を許容するか必ず何か(0も含めた)値が入らないといけないか
👉nilを許容する=オプショナル型
って感じなイメージ
*よくある入力欄なんかで、勤務先電話番号なんかを
必須にしてる=空欄を許さない
任意にしてる=空欄でもいい=オプショナル型
ってゆーとよりイメージ湧きやすいかな💦🧐
まあ、解説すると難しそうに感じるかもだけど、やり方は簡単で、
引数:データ型?
👉引数名の後ろに?を付けるだけ
//オプショナル型
var int5_8_1: Int?
if int5_8_1 != nil {
print("nil以外だぞ")
} else {
print("nilだぞ")
}
てな感じのコードで、実際テストしてみると、、、
//オプショナル型
var int5_8_1: Int?
//追加
int5_8_1 = 10
if int5_8_1 != nil {
print("nil以外だぞ")
} else {
print("nilだぞ")
}
てな感じで、追加して実行すると、
次は、強制アンラップの方法なんだけど、
強制アンラップは、オプショナル型に統一する時に使う
//強制アンラップ
//オプショナル型変数
var idx5_8_2: Int?
idx5_8_2 = 3
var array5_8_2 = ["りんご","ゴリラ","ラッパ","パン"]
if idx5_8_2 != nil {
print(array5_8_2[idx5_8_2])
} else {
print("\(idx5_8_2)の値がないぞ")
}
てな感じのコードがあったとして〜〜〜
//強制アンラップ
//オプショナル型変数
var idx5_8_2: Int?
idx5_8_2 = 3
var array5_8_2 = ["りんご","ゴリラ","ラッパ","パン"]
if idx5_8_2 != nil {
print(array5_8_2[idx5_8_2!])
} else {
print("\(String(describing: idx5_8_2))の値がないぞ")
}
オプショナル型を非オプショナル型に強制的にしてあげて、値を取り出せるようにしてあげる
👉nilを許容するために、Int?でオプショナル型で宣言してる引数を、!で強制アンラップすることで、
処理の中で、普通のInt型に変換してあげる
て言えばイメージ出来るかな💦👀
条件式の中で、実行用の引数を宣言して使うなら、
var idx5_8_3: Int?
idx5_8_3 = 2
var array5_8_3 = ["りんご","ゴリラ","ラッパ","パン"]
//引数を宣言
if let constValue5_8_3 = idx5_8_3 {
print(array5_8_3[constValue5_8_3])
} else {
print("値がないぞ")
}
var idx5_8_3: Int?
idx5_8_3 = 2
var array5_8_3 = ["りんご","ゴリラ","ラッパ","パン"]
//変数で宣言
if var varValue5_8_3 = idx5_8_3 {
print(array5_8_3[varValue5_8_3])
} else {
print("値がないぞ")
}
ちなみに、変数名の力をよく理解してない人がやりがちなんだけど、
var idx5_8_4: Int?
idx5_8_4 = 1
var array5_8_4 = ["りんご","ゴリラ","ラッパ","パン"]
if let idx5_8_4 = idx5_8_4 {
print(array5_8_4[idx5_8_4])
} else {
print("値がないぞ")
}
てな感じで、インデックスにした引数を同じ名前の引数に代入すると、、、
普通は、同じ引数を別に宣言してるから、コンフリクトしそうなのに👀🕺って、ここまで来ると、勘のいい人なら分かるかもだけど
var idx5_8_5: Int?
idx5_8_5 = 0
var array5_8_5 = ["りんご","ゴリラ","ラッパ","パン"]
if let idx5_8_5 {
print(array5_8_5[idx5_8_5])
} else {
print("値がないぞ")
}
てな感じのコードにして、実行しても、
ここまで長くなりすぎて、
で、あれ何でこれやってたっけ?🤔
ってなってる人もいるかもしれないんだけど、、、
最初の強制アンラップのコードと見比べてもらうと
//強制アンラップ
//オプショナル型変数
var idx5_8_2: Int?
idx5_8_2 = 3
var array5_8_2 = ["りんご","ゴリラ","ラッパ","パン"]
if idx5_8_2 != nil {
print(array5_8_2[idx5_8_2!])
} else {
print("\(String(describing: idx5_8_2))の値がないぞ")
}
var idx5_8_5: Int?
idx5_8_5 = 0
var array5_8_5 = ["りんご","ゴリラ","ラッパ","パン"]
if let idx5_8_5 {
print(array5_8_5[idx5_8_5])
} else {
print("値がないぞ")
}
てな感じで!を使わずに、よりシンプルに簡単に、
オプショナル型を使いながら、処理エラーを回避できる
ってこと🕺
他にも〜〜〜
var menu1_5_9 : String?
var menu2_5_9 : String?
menu1_5_9 = "カツ丼"
menu2_5_9 = "天丼"
if let menu1_5_9, let menu2_5_9 {
print("\(menu1_5_9)にはうどんが付きます")
print("\(menu2_5_9)には蕎麦が付きます")
} else {
print("以外は単品のみです")
}
インスタンスを指定するときに、最初から強制アンラップでオプショナル型を指定しておいて、
var idx5_10: Int!
idx5_10 = 3
var array5_10 = ["りんご","ゴリラ","ラッパ","パン"]
if idx5_10 != nil {
print(array5_10[idx5_10])
} else {
print("値がないぞ")
}
ただし、
var string5_11 = nil
var int5_11 = nil
var double5_11 = nil
は、
var string5_11: String! = nil
var int5_11: Int! = nil
var double5_11: Double! = nil
または、
var string5_11: String? = nil
var int5_11: Int? = nil
var double5_11: Double? = nil
で、
まあ、オプショナル型かどうかを明確にしてないのに、
nilを代入したら、型推論できないからダメだよ
ってことみたいだね。。。💦
これからSwiftUIで実際に色々なアプリを組むときでも、
ここが一番Swiftの山場
ってゆーても過言じゃないくらいだから気をつけとこう🌱
型のキャスト
後は、キャストには
アップキャスティング
ダウンキャスティング
の2種類があって、アップキャスティングの時には、
as! String
みたいに強制をかけても大丈夫だけど、ダウンキャスティングの時は、
as? String
みたいにしないと危険って書いてるね👀💦内容的には、以上🕺まあ、安全にコードを書いて、エラーがあったら修正する作法なんで、やはり、
💃入り口は出口だね🕺
今回のコード(まとめ)
/**:---------------------------------------------------------------------------------------------------------------------------------
じっくり 第5章
-------------------------------------------------------------------------------------------------------------------------------------*/
var number5_1 = 20
//Int8の最小〜最大
print("Int8は最小:\(Int8.min)〜最大:\(Int8.max)")
//Int16の最小〜最大
print("Int16は最小:\(Int16.min)〜最大:\(Int16.max)")
//Int32の最小〜最大
print("Int32は最小:\(Int32.min)〜最大:\(Int32.max)")
//Int64の最小〜最大
print("Int64は最小:\(Int64.min)〜最大:\(Int64.max)")
//Float16
var float5_2_1: Float16 = 5432.1234
//Float32
var float5_2_2: Float32 = 5432.1234
//Float64
var float5_2_3: Float64 = 5432.1234
//Float16出力
print("Float16だと、\(float5_2_1)")
//Float32出力
print("Float32だと、\(float5_2_2)")
//Float64出力
print("Float64だと、\(float5_2_3)")
//Bool型
//定価
var price: Double = 10000
//税込価格
var sumPrice: Double = price * customerTax
//真偽フラグ
var over10000: Bool = true
//もし、1万円以下なら
if sumPrice <= 10000 {
print("税込価格は、\(sumPrice)円")
//falseを返せ
print(!over10000)
} else {
print("税込価格は、\(sumPrice)円")
//trueを返せ
print(over10000)
}
//文字列型
//1文字
let male5_4_1: Character = "男"
let female5_4_1: Character = "女"
print("日本の銭湯は一般的に\(male5_4_1)湯と\(female5_4_1)湯に分かれています。")
//Unicodeで旧Twitterの会社名を表示
let oldTwitter5_4 : Character = "\u{0058}"
print("旧Twitterは\(oldTwitter5_4)に変わりました。")
//複数文字
var companyName5_4 : String = "facebook"
let newCompanyName5_4 : String = "Meta"
print("会社名は\(companyName5_4)")
companyName5_4 = newCompanyName5_4
print("会社名は\(companyName5_4)")
//特殊文字の使用例
//1文字
let male5_5_1: Character = "男"
let female5_5_1: Character = "女"
//改行文字
print("日本の銭湯は一般的に\(male5_5_1)湯と\n\(female5_5_1)湯に分かれています。")
//Unicodeで旧Twitterの会社名を表示
let oldTwitter5_5 : Character = "\u{0058}"
//水平タブ
print("旧Twitterは、\n\t\(oldTwitter5_5)\tに変わりました。")
let male5_6_1 = "男"
let female5_6_1 = "女"
print("日本の銭湯は一般的に\(male5_6_1)湯と\(female5_6_1)湯に分かれています。")
//定価
var price5_6_2 = 10000
//消費税
let customerTax = 1.10
//税込価格
var sumPrice5_6_2 = Double(price5_6_2) * customerTax
//真偽フラグ
var over100005_6_2 = true
//もし、1万円以下なら
if sumPrice5_6_2 <= 10000 {
print("税込価格は、\(sumPrice5_6_2)円")
//falseを返せ
print(!over100005_6_2)
} else {
print("税込価格は、\(sumPrice5_6_2)円")
//trueを返せ
print(over100005_6_2)
}
//タプル
var tuple5_7_1 = (10.0, "M_Kaku堂")
var kakuString5_7_1 = tuple5_7_1.1
print(kakuString5_7_1)
tuple5_7_1.0 = 12
print(tuple5_7_1)
var tuple5_7_2 = (count:10.0,name:"M_Kaku堂")
print("タプルの名前要素は、\(tuple5_7_2.name)")
//オプショナル型
var int5_8_1: Int?
//追加
int5_8_1 = 10
if int5_8_1 != nil {
print("nil以外だぞ")
} else {
print("nilだぞ")
}
//強制アンラップ
//オプショナル型変数
var idx5_8_2: Int?
idx5_8_2 = 3
var array5_8_2 = ["りんご","ゴリラ","ラッパ","パン"]
if idx5_8_2 != nil {
print(array5_8_2[idx5_8_2!])
} else {
print("\(String(describing: idx5_8_2))の値がないぞ")
}
var idx5_8_3: Int?
idx5_8_3 = 2
var array5_8_3 = ["りんご","ゴリラ","ラッパ","パン"]
//変数で宣言
if var varValue5_8_3 = idx5_8_3 {
print(array5_8_3[varValue5_8_3])
} else {
print("値がないぞ")
}
var idx5_8_4: Int?
idx5_8_4 = 1
var array5_8_4 = ["りんご","ゴリラ","ラッパ","パン"]
if let idx5_8_4 = idx5_8_4 {
print(array5_8_4[idx5_8_4])
} else {
print("値がないぞ")
}
var idx5_8_5: Int?
idx5_8_5 = 0
var array5_8_5 = ["りんご","ゴリラ","ラッパ","パン"]
if let idx5_8_5 {
print(array5_8_5[idx5_8_5])
} else {
print("値がないぞ")
}
var menu1_5_9 : String?
var menu2_5_9 : String?
menu1_5_9 = "カツ丼"
menu2_5_9 = "天丼"
if let menu1_5_9, let menu2_5_9 {
print("\(menu1_5_9)にはうどんが付きます")
print("\(menu2_5_9)には蕎麦が付きます")
} else {
print("以外は単品のみです")
}
var idx5_10: Int!
idx5_10 = 3
var array5_10 = ["りんご","ゴリラ","ラッパ","パン"]
if idx5_10 != nil {
print(array5_10[idx5_10])
} else {
print("値がないぞ")
}
var string5_11: String? = nil
var int5_11: Int? = nil
var double5_11: Double? = nil
さてと、次回は
第6章に入ってく〜〜〜
記事公開したら、
でやったやり方で、
Xcodeに今回の内容をいつも通り連携しとこ。
記事公開後
今回は特に、Xcode上で動かす機能がなかったので、動作確認のビューを削除して〜〜〜
てな感じ🕺
この記事が気に入ったらサポートをしてみませんか?