文字列から数値を抽出し、Swiftの新しい配列に入れる必要があります。
var str = "I have to buy 3 apples, 7 bananas, 10eggs"
私は各キャラクターをループしようとしましたが、CharactersとIntを比較することはできません。
まず、単一のアイテムを処理できるように文字列を分割します。次に、NSCharacterSet
を使用して、数字のみを選択します。
import Foundation
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let strArr = str.split(separator: " ")
for item in strArr {
let part = item.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
if let intVal = Int(part) {
print("this is a number -> \(intVal)")
}
}
Swift 4:
let string = "I have to buy 3 apples, 7 bananas, 10eggs"
let stringArray = string.components(separatedBy: CharacterSet.decimalDigits.inverted)
for item in stringArray {
if let number = Int(item) {
print("number: \(number)")
}
}
スイフト3/4
let string = "0kaksd020dk2kfj2123"
if let number = Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) {
// Do something with this number
}
次のような拡張機能を作成することもできます。
extension Int {
static func parse(from string: String) -> Int? {
return Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined())
}
}
そして、後でそれを次のように使用します:
if let number = Int.parse(from: "0kaksd020dk2kfj2123") {
// Do something with this number
}
_let str = "Hello 1, World 62"
let intString = str.componentsSeparatedByCharactersInSet(
NSCharacterSet
.decimalDigitCharacterSet()
.invertedSet)
.joinWithSeparator("")
_
それはあなたにすべての数字を含む文字列を取得し、あなたはこれを行うことができます:
_let int = Int(intString)
_
let int = Int(intString)
はオプションであるため、必ずラップを解除してください。
Swift正規表現の一致を抽出 からの「正規表現ヘルパー関数」の使用
func matchesForRegexInText(regex: String!, text: String!) -> [String] {
let regex = NSRegularExpression(pattern: regex,
options: nil, error: nil)!
let nsString = text as NSString
let results = regex.matchesInString(text,
options: nil, range: NSMakeRange(0, nsString.length))
as! [NSTextCheckingResult]
return map(results) { nsString.substringWithRange($0.range)}
}
あなたはそれを簡単に達成できます
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let numbersAsStrings = matchesForRegexInText("\\d+", str) // [String]
let numbersAsInts = numbersAsStrings.map { $0.toInt()! } // [Int]
println(numbersAsInts) // [3, 7, 10]
パターン "\d+"
は1つ以上の10進数に一致します。
もちろん、何らかの理由でそれを好む場合、ヘルパー関数を使用せずに同じことができます:
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let regex = NSRegularExpression(pattern: "\\d+", options: nil, error: nil)!
let nsString = str as NSString
let results = regex.matchesInString(str, options: nil, range: NSMakeRange(0, nsString.length))
as! [NSTextCheckingResult]
let numbers = map(results) { nsString.substringWithRange($0.range).toInt()! }
println(numbers) // [3, 7, 10]
正規表現を使用しない代替ソリューション:
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let digits = "0123456789"
let numbers = split(str, allowEmptySlices: false) { !contains(digits, $0) }
.map { $0.toInt()! }
println(numbers) // [3, 7, 10]
@flashadvancedの answer から適応すると、次のほうが短く簡単であることがわかりました。
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let component = str.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
let list = component.filter({ $0 != "" }) // filter out all the empty strings in the component
print(list)
遊び場で試してみたが、うまくいく
それが役に立てば幸い :)
スイフト2.2
let strArr = str.characters.split{$0 == " "}.map(String.init)
for item in strArr {
let components = item.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
let part = components.joinWithSeparator("")
if let intVal = Int(part) {
print("this is a number -> \(intVal)")
}
}
// This will only work with single digit numbers. Works with “10eggs” (no space between number and Word
var str = "I have to buy 3 apples, 7 bananas, 10eggs"
var ints: [Int] = []
for char:Character in str {
if let int = "\(char)".toInt(){
ints.append(int)
}
}
ここでのコツは、文字列が整数であるかどうかを確認できることです(ただし、文字が文字列であるかどうかは確認できません)。文字列のすべての文字をループ処理することにより、文字列補間を使用して文字から文字列を作成し、その文字列が整数としてキャストされるかどうかを確認します。
可能であれば、アレイに追加します。
// This will work with multi digit numbers. Does NOT work with “10 eggs” (has to have a space between number and Word)
var str = "I have to buy 3 apples, 7 bananas, 10 eggs"
var ints: [Int] = []
var strArray = split(str) {$0 == " "}
for subString in strArray{
if let int = subString.toInt(){
ints.append(int)
}
}
ここで、任意のスペースで文字列を分割し、長い文字列にあるすべての部分文字列の配列を作成します。
再びすべての文字列をチェックして、整数であるか(またはキャストできる)かどうかを確認します。
私の質問に答えてくれたすべての人に感謝します。
Swift文法のみを使用するコードのブロックを探していました。これは、今だけ文法を学習しているためです。
私は私の質問に答えを得ました。たぶんそれは簡単な解決方法ではないかもしれませんが、Swift language。
var article = "I have to buy 3 apples, 7 bananas, 10 eggs"
var charArray = Array(article)
var unitValue = 0
var total = 0
for char in charArray.reverse() {
if let number = "\(char)".toInt() {
if unitValue==0 {
unitValue = 1
}
else {
unitValue *= 10
}
total += number*unitValue
}
else {
unitValue = 0
}
}
println("I bought \(total) apples.")