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

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

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

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

Q&A

解決済

2回答

2930閲覧

Swift 配列の各要素の指定文字列を削除する

mitci

総合スコア37

Swift

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

0グッド

0クリップ

投稿2017/10/03 13:05

編集2017/10/03 14:46

###前提・実現したいこと
文字列の入った配列の 各要素の先頭から7文字 を削除したいです。

swift

1var testAry = ["5257353くだもの", "3917253サッカーボール", "1213453社会科見学"] 2 .map {$0/*7文字まで削除*/ }

のように.mapで処理しようとすると、まず開始するString.Indexを宣言したり、終了するString.Indexを宣言したりしないといけないため、うまくいきません・・・

結果として

swift

1["くだもの", "サッカーボール", "社会科見学"]

となれば、別に「7文字目までを削除」ではなく、6文字目7文字目がかならず"53"のため、「各要素の"53"を見つけたらそれ以前を削除」でも構いません。
###試したこと
.forEachで回すのでしょうか?

###補足情報(言語/FW/ツール等のバージョンなど)
swift3 Xcode3

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

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

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

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

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

ykws

2017/10/03 14:16

Swift3 なら Swift2 のタグは消しましょう
fuzzball

2017/10/04 02:51

8文字目以降に"53"が現れることは絶対にないのでしょうか?
mitci

2017/10/04 11:24

すべての要素内で8文字目以降に"53"が現れることはありません。8文字目は必ず日本語(全角のひらがな、かたかな、漢字です)
guest

回答2

0

components(separatedBy:) - NSString | Apple Developer Documentation を利用してこういう風に書くことはできます。

Swift

1let newAry = testAry.map { $0.components(separatedBy: "53").last }

投稿2017/10/03 14:15

ykws

総合スコア1236

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

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

mitci

2017/10/04 11:27

ありがとうございます .last というのは全く知りませんでした・・・
guest

0

ベストアンサー

区切るならykwsさんと同じですが下記でしょうか。

swift

1import Foundation 2 3var testAry = ["5257353くだもの", "3917253サッカーボール", "1213453社会科見学"] 4.map {$0.components(separatedBy: "53")[1]}

部分文字列としてであれば、下記ではどうでしょうか。

swift

1var testAry = ["5257353くだもの", "3917253サッカーボール", "1213453社会科見学"] 2.map {$0.substring(from:$0.index($0.startIndex, offsetBy: 7))}

投稿2017/10/03 14:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fuzzball

2017/10/04 04:02

NSStringにキャストするとシンプルに書けます。index面倒くさいですよね‥。 .map {($0 as NSString).substring(from: 7)
mitci

2017/10/04 11:36

indexめんどくさいです・・・ まだ普通の変数でならいいのですが、配列が絡むと全くわからず・・ 使用感としては suyamaさんの .map {$0.components(separatedBy: "53")[1]} が一番シンプルかつオプショナルにもならず汎用性も高いようですね 要素を"53"で二つに分けて、 [0] = "52573" [1] = "くだもの" の[1]だけをとる という理解で大丈夫でしょうか? componentsした文字列をそのままインデックスの指定で取り出せるんですね・・・ 一度別の配列に代入するものと勝手に思っておりました・・・
退会済みユーザー

退会済みユーザー

2017/10/04 14:53

fuzzballさん、フォローありがとうございます。助かります。 indexは癖がありますね。 mitciさん > 要素を"53"で二つに分けて、 > [0] = "52573" > [1] = "くだもの" > の[1]だけをとる 動きはご認識の通りかと思います。
fuzzball

2017/10/04 23:55 編集

そっちを使うなら、ykwsさんの回答のように.lastにしないと、"53"が二つ以上含まれる場合に正しく動作しないと思います。 【追記】いま確認しましたが、.lastを使うとOptional型になってしまうので、mapではなくflatMapを使うといいです。
mitci

2017/10/05 11:26

flatMapですか・・・知りませんでした .last! で無理やり入れるか、[1]でそのまま使うか("53"が二つ出てくることは現状ないため) と迷っていました・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問