テキストフィールドに入力できるのはStringデータだけなので、型変換をする必要がある
オプショナルバリュー、オプショナルバインディングを学ぶ
TextField, textFieldStyle, isEmpty, keyboardType, Group, @FocusState, fucused, toolbar, ToolbarItemGroup, guard let-else, if let-else, !, ??, nil
### テキストフィールドを作る
入力した名前を表示する
L TextFieldで作成する
@State var name: String = ""
var body: some View {
TextField("お名前は?", text: $name)
.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(width: 250)
if (!name.isEmpty){
Text("\(name)さん、こんにちは!")
}
}
キーボードの種類を指定
L keyboardType(.numberPad)のように指定する
L 複数のビューを一纏めにする場合は Groupで囲む
L guard let-elseで整数に変換できたら変換後の値をnumに代入、変換できなかったらfalse
struct ContentView: View {
@State var kosu:String = ""
let tanka:Double = 250
let tax:Double = 1.1
var body: some View {
VStack(alignment: .leading){
HStack {
Text("個数:").padding(.horizontal, 0)
TextField("0", text: $kosu)
.textFieldStyle(RoundedBorderTextFieldStyle())
.keyboardType(.numberPad)
.frame(width: 100)
}
.font(.title)
.frame(width: 200)
Group {
if kosuCheck(min: 1, max: 10){
Text("\(price())円です。")
.font(.title)
} else {
Text("個数は1〜10個を入れてください。")
.foregroundColor(.red)
.font(.headline)
}
}.frame(width: 300, height: 30)
}
}
func kosuCheck(min:Int, max:Int) -> Bool {
guard let num = Int(kosu) else {
return false
}
return (num>=min && num <= max)
}
func price() -> Int {
if let num = Double(kosu){
let result = Int(tanka * num * tax)
return result
} else {
return -1
}
}
}
Doneボタンの追加
L focusが終わるとキーボードが下がる
@FocusState var isInputActive: Bool
@State var kosu:String = ""
let tanka:Double = 250
let tax:Double = 1.1
var body: some View {
VStack(alignment: .leading){
HStack {
Text("個数:").padding(.horizontal, 0)
TextField("0", text: $kosu)
.textFieldStyle(RoundedBorderTextFieldStyle())
.keyboardType(.numberPad)
.frame(width: 100)
.focused($isInputActive)
}
.font(.title)
.frame(width: 200)
Group {
if kosuCheck(min: 1, max: 10){
Text("\(price())円です。")
.font(.title)
} else {
Text("個数は1〜10個を入れてください。")
.foregroundColor(.red)
.font(.headline)
}
}.frame(width: 300, height: 30)
}
.toolbar {
ToolbarItemGroup(placement: .keyboard){
Spacer()
Button("Done"){
isInputActive = false
}
}
}
}
### オプショナルバインディング
nilかもしれないオプショナルバリュー
let nums:[Int] = []
let lastNum = nums.last
let ans = lastNum * 2
var num:Int
num = 5
num = nil
代入できる変数を作る
var num:Int?
num = 5
num = nil
??演算子を使う
let nums:[Int] = [1, 2, 3]
let lastNum = nums.last ?? 0
let ans = lastNum * 2
print(ans)
### guard let-elseを使ったオプショナルバインディング
関数を実行する前にオプショナルバリューをチェックするオプショナルバインディング構文
L Int(kosu)がnilならfalseを戻す
L if let elseでも同様にオプショナルバインディングを行う
func kosuCheck(min:Int, max:Int) -> Bool {
guard let num = Int(kosu) else {
return false
}
return (num>=min && num <= max)
}
なるほど、中々深いな
バリデーションでチェックしてたから意識したことなかったけど、Swiftの場合はnilをチェックする場合はこう書くのね。