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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2964閲覧

swift subscript is unavailable: cannot subscript String with an Int エラー

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2016/08/14 08:20

編集2016/08/14 08:24

###文字列に3桁の数字を入力させ、検査
まだ、C言語の入門程度のレベルですが、今回初めてswiftに挑戦しています。
初めてでわからないことばかりですが、ググったりしてなんとかここまでたどり着きました。
今回つくっったのは、
文字列に標準入力させた3桁の数字を代入させるソースコードですが、エラーがでてきてしまいつんでます。
ググってもなかなか出てこないので困っています。

###発生している問題・エラーメッセージ

if s[i]==s[j] 文字列に重複がないかのチェックでエラーが出てしまいました。 //エラー 'subscript' is unavailable: cannot subscript String with an Int,see the documentation comment for discussion

###該当のソースコード

import Foundation //文字列sを検査 func check(s:String) -> Int { var i:Int = 0 var j:Int = 0 //文字列sが三文字か検査 if(s.characters.count != 3){ return 1 } //文字列sに数字以外が入力されていないか検査 let kensa = NSPredicate(format: s) if kensa==0{ return 2 } //文字列sに重複した数が入力されていないか検査 for i in 0..<3 { for j in 0..<i { if s[i]==s[j] { return 3 } } } return 0 } //数を入力 func make3you(inout s:String) { var chk = 0 repeat{ print("数を入力") if let input: NSFileHandle = NSFileHandle.fileHandleWithStandardInput(){ let str = NSString(data: input.availableData, encoding: NSUTF8StringEncoding) let s = str!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) chk=check(s) //check関数へ } switch(chk){ case 1:print("きちんと3文字で入力してください"); break case 2:print("数字以外の文字を入力しないでください");break case 3:print("同じ数を複数入力しないでください");break } }while chk != 0 } var mine : String = "000" make3you(&mine) print(mine) exit(0)

###試したこと
どちらもINT型に変更したら式が実行できるのかと考え
Int(s[i]) == Int(s[j])
に変更しましたが、Characterの型ではIntのイニシャライザーを実行できませんと出てしまい、これもググってもなかなかわからくて困っています。

###補足情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

全体的な動きはよく理解できなかったので質問の部分だけ以下の様に書いてみました、Playgroundで確認しましたが判定もちゃん動いているようでした。

文字重複チェック

swift

1func check(s: String) -> Int { 2 3 // ↓ここが回答になります。 4 let characters = Array(s.characters) 5 6 //文字列sに重複した数が入力されていないか検査 7 for i in 0..<3 { 8 for j in 0..<i { 9 if characters[i]==characters[j] { 10 return 3 11 } 12 } 13 } 14 return 0 15} 16 17//--- 確認 --- 18let s1 = "aaa" 19check(s1) 20//=> 3 21 22let s2 = "abb" 23check(s2) 24//=> 3 25 26let s3 = "abc" 27check(s3) 28//=> 0

数字、3桁チェック

swift

1func number3Check(str: String) -> Bool { 2 let pattern = "^\\d{3}$" 3 let match = (str as NSString).rangeOfString(pattern, options: .RegularExpressionSearch) 4 return match.location != NSNotFound 5} 6 7//--- 確認 --- 8number3Check("123") 9//=> true 10 11number3Check("1") 12//=> false 13 14number3Check("12") 15//=> false 16 17number3Check("12A") 18//=> false

全て網羅チェック

swift

1func number3Check(str: String) -> Bool { 2 let pattern = "\\A(\\d)(?!\\1)(\\d)(?!\\1|\\2)\\d\\z" 3 let match = (str as NSString).rangeOfString(pattern, options: .RegularExpressionSearch) 4 return match.location != NSNotFound 5} 6 7// --- 確認 --- 8 9number3Check("123") 10//=> true 11 12number3Check("1") 13//=> false 14 15number3Check("12") 16//=> false 17 18number3Check("a2b") 19//=> false 20 21number3Check("12A") 22//=> false 23 24number3Check("121") 25//=> false 26 27number3Check("112") 28//=> false

投稿2016/08/14 14:40

編集2016/08/15 00:49
_Kentarou

総合スコア8490

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

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

退会済みユーザー

退会済みユーザー

2016/08/14 16:15

動作は確認できました!ほんとうにありがとうござい!!! 自分の知識ではよくわからないのですが、回答にあたる一行はどういった動作をするのですか? また、この文字列を3桁であるかどうか判断する式と文字列に数字以外が含まれていないか判断する式も教えていただけたら幸いです。。。
_Kentarou

2016/08/14 23:32

数字、3桁チェックを回答に追記しました。 本当は重複チェックも同時に行いたかったのですが、自分の正規表現のレベルが低くて調べても実現できませんでした、、、
_Kentarou

2016/08/15 00:51

自分もわからなかったのでteratailの正規表現で聞いてみました、、、 https://teratail.com/questions/44326 全てのチェックを網羅した正規表現ができたので回答に追記しました。
退会済みユーザー

退会済みユーザー

2016/08/15 06:12

ありがとうございます! 自分では到底解決できなかったのでほんとに感謝してます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問