Swift文字列が特定の値で始まるか終わるかをテストしようとしています。これらのメソッドは存在しません:
var str = "Hello, playground"
str.startsWith("Hello") // error
str.endsWith("ground") // error
プレフィックスとサフィックスの文字列も取得したいと思います。 here および here と答えられるように、部分文字列を見つけることができましたが、Swiftでは範囲が非常に苦痛です。
それを行う簡単な方法はありますか?
(私は ドキュメント を読んでいたときに答えに出くわしました。そして、SO答えが私の検索語に対して出てこなかったので、ここにQ&Aを追加しています。)
Swift 4に更新
hasPrefix(_:)
およびhasSuffix(_:)
メソッドを使用して、別のストリングとの同等性をテストできます。
let str = "Hello, playground"
if str.hasPrefix("Hello") { // true
print("Prefix exists")
}
if str.hasSuffix("ground") { // true
print("Suffix exists")
}
実際のプレフィックスまたはサフィックスのサブストリングを取得するには、次のいずれかの方法を使用できます。簡単にするために最初の方法をお勧めします。すべてのメソッドはstr
を次のように使用します
let str = "Hello, playground"
方法1:(推奨)prefix(Int)
およびsuffix(Int)
let prefix = String(str.prefix(5)) // Hello
let suffix = String(str.suffix(6)) // ground
これは私の意見ではより良い方法です。以下の方法2および3とは異なり、この方法は、インデックスが範囲外になってもクラッシュしません。文字列内のすべての文字を返すだけです。
let prefix = String(str.prefix(225)) // Hello, playground
let suffix = String(str.suffix(623)) // Hello, playground
もちろん、クラッシュはコードに問題があることを知らせてくれるので良い場合があります。したがって、以下の2番目の方法も検討してください。インデックスが範囲外になると、エラーがスローされます。
方法2:prefix(upto:)
およびsuffix(from:)
Swift Stringインデックスは、特殊文字(絵文字など)を考慮する必要があるため、注意が必要です。ただし、インデックスを取得すると、プレフィックスまたはサフィックスを簡単に取得できます。 (String.Index
の 他の答え を参照してください。)
let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str.prefix(upTo: prefixIndex)) // Hello
let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str.suffix(from: suffixIndex)) // ground
範囲外にならないようにしたい場合は、limitedBy
を使用してインデックスを作成できます(これも this answer を参照してください)。
方法3:添え字
Stringはコレクションであるため、添え字を使用してプレフィックスとサフィックスを取得できます。
let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str[..<prefixIndex]) // Hello
let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str[suffixIndex...]) // ground
プレフィックスとサフィックスの平等
文字列に特定の文字列プレフィックスまたはサフィックスがあるかどうかを確認するには、文字列のhasPrefix(:)およびhasSuffix(:)メソッドを呼び出します。 String型の単一引数で、ブール値を返します。