質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1069閲覧

SwiftUIでTextFieldに入ってきた値を半角か全角で分岐したい

uramomotoro

総合スコア1

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2023/02/06 08:29

実現したいこと

SwiftUIでTextFieldに入ってきた値を半角のとき、10文字まで、全角のとき5文字までが入力できるようにする分岐を作成したい。

前提

TextFieldに入ってくる値が半角かどうかを判別する処理がわからない。

該当のソースコード

Swift

1struct hogeView: View { 2 3 @AppStorage("hoge") var hogehoge = "hogehoge" 4 var body: some View { 5 TextField("hogeText", text: $hoge) //ここに入ってくる値を半角か全角で分岐したい 6 7 8 //こんな感じの分岐ができたらいいなと思っています。 9 if(//全部半角の時) { 10 文字数10文字にする処理 11 }else { 12 文字数5文字にする処理 13 } 14} 15struct hogeView_Previews: PreviewProvider { 16 static var previews: some View { 17 hogeView() 18 } 19}

補足情報(FW/ツールのバージョンなど)

XCode Version 14.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2023/02/06 09:13

絵文字は全角扱いですか? それとも半角? (それ以外にもいろんな文字があるからなぁ…。)
uramomotoro

2023/02/06 14:47

確かに絵文字もありますね。。絵文字入れるとしたら全角になるのかなと思いますが、 全角はひらがな、カタカナ、漢字、数字、アルファベット、 半角はカタカナ、数字、アルファベットを想定していました。
guest

回答1

0

ベストアンサー

Shift JIS の 1byte 文字のみで構成されているかどうか
チェックしてみるのはいかがでしょうか?

SwiftUI

1import SwiftUI 2 3struct ContentView: View { 4 @State var hoge = "" 5 @State var textStr = "半角のみです" 6 var body: some View { 7 VStack { 8 VStack { 9 TextField("hogeText", text: $hoge) 10 } 11 .onChange(of: hoge) {newValue in 12 if isAll(hoge) { 13 hoge = String(hoge.prefix(10)) 14 textStr = "半角のみです" 15 } 16 else { 17 hoge = String(hoge.prefix(5)) 18 textStr = "全角が含まれています" 19 } 20 } 21 22 Text(textStr) //内容確認のため一時的に配置しています。 23 } 24 } 25 26 func isAll(_ target: String) -> Bool { 27 for str in Array(target) { 28 if String(str).lengthOfBytes(using: String.Encoding(rawValue: NSShiftJISStringEncoding)) != 1 { 29 return false 30 } 31 } 32 return true 33 } 34}

投稿2023/02/08 04:10

編集2023/02/08 04:32
uni3

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uramomotoro

2023/02/09 03:36

お返事遅くなり申し訳ありません。 確かに「半角の」ではなく「1byte 文字のみ」で分岐する方法ありですね!! 解決策見つけてくださりありがとうございます。
uni3

2023/02/09 05:05

後で見直したところ、 isAll メソッドの中身は return target.lengthOfBytes(using: String.Encoding(rawValue: NSShiftJISStringEncoding)) == target.count でも問題ないかもしれませんね。 「この文字は半角扱いにしたい」 「この文字は全角扱いにしたい」 という文字が別途ある場合は for str in Array(target) { の下に if String(str) == "," { return false } 等を付け加えることで 対処して頂ければと思います。
uni3

2023/02/09 05:13

先ほどのコメントがおかしかったため 後半を修正させて下さい。 「この文字は半角扱いにしたい」 「この文字は全角扱いにしたい」 という文字が別途ある場合は for str in Array(target) { の下に if String(str) == "あ" { continue //「あ」を半角扱いに } if String(str) == "a" { return false //「a」 を全角扱いに } 等を付け加えることで 対処して頂ければと思います。
uramomotoro

2023/02/11 13:11

@Uni3 さま 助かります。ご丁寧に説明してくださりありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問