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

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

ただいまの
回答率

89.06%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,884
退会済みユーザー

退会済みユーザー

文字列に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のイニシャライザーを実行できませんと出てしまい、これもググってもなかなかわからくて困っています。

補足情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

文字重複チェック

func check(s: String) -> Int {

    // ↓ここが回答になります。
    let characters = Array(s.characters)

    //文字列sに重複した数が入力されていないか検査
    for i in 0..<3 {
        for j in 0..<i {
            if characters[i]==characters[j] {
                return 3
            }
        }
    }
    return 0
}

//--- 確認 ---
let s1 = "aaa"
check(s1)
//=> 3

let s2 = "abb"
check(s2)
//=> 3

let s3 = "abc"
check(s3)
//=> 0

数字、3桁チェック

func number3Check(str: String) -> Bool {
    let pattern = "^\\d{3}$"
    let match = (str as NSString).rangeOfString(pattern, options: .RegularExpressionSearch)
    return match.location != NSNotFound
}

//--- 確認 ---
number3Check("123")
//=> true

number3Check("1")
//=> false

number3Check("12")
//=> false

number3Check("12A")
//=> false

全て網羅チェック

func number3Check(str: String) -> Bool {
    let pattern = "\\A(\\d)(?!\\1)(\\d)(?!\\1|\\2)\\d\\z"
    let match = (str as NSString).rangeOfString(pattern, options: .RegularExpressionSearch)
    return match.location != NSNotFound
}

// --- 確認 ---

number3Check("123")
//=> true

number3Check("1")
//=> false

number3Check("12")
//=> false

number3Check("a2b")
//=> false

number3Check("12A")
//=> false

number3Check("121")
//=> false

number3Check("112")
//=> false

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/15 01:15

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

    キャンセル

  • 2016/08/15 08:32

    数字、3桁チェックを回答に追記しました。

    本当は重複チェックも同時に行いたかったのですが、自分の正規表現のレベルが低くて調べても実現できませんでした、、、

    キャンセル

  • 2016/08/15 09:51

    自分もわからなかったのでteratailの正規表現で聞いてみました、、、
    https://teratail.com/questions/44326

    全てのチェックを網羅した正規表現ができたので回答に追記しました。

    キャンセル

  • 2016/08/15 15:12

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

    キャンセル

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る