Swiftの導入により、新しい言語を理解しようとしています。
私はiOS開発者であり、アプリケーションでNSString, NSInteger, NSDictionary
などのタイプを使用します。 Appleの「The Swift Programming Language」電子書籍では、SwiftタイプString, Int, Dictionary
を使用していることに気付きました。
Swift型には、Foundation型にある関数の一部がない(または異なる名前が付けられている)ことに気付きました。たとえば、NSString
にはlength
プロパティがあります。しかし、Swift String
に類似したものを見つけることができませんでした。
IOSアプリケーションでは、Foundationタイプを引き続き使用する必要がありますか?
可能な限り、Swiftネイティブ型を使用する必要があります。言語はそれらを使用するように最適化されており、ほとんどの機能はネイティブ型とFoundation
型の間でブリッジされています。
String
とNSString
はほとんど互換性があります。つまり、String
変数をNSString
パラメーターを取るメソッドに渡すことができますが、その逆もありますが、現時点では一部のメソッドは自動的にブリッジされないようです。文字列の長さを取得する方法については、 this answer および this answercontainsString()
を使用して部分文字列をチェックする方法についての議論。 (免責事項:私はこれら両方の答えの著者です)
私は他のデータ型を完全には調査していませんが、上記のバージョンのいくつかのバージョンは、Array
/NSArray
、Dictionary
/NSDictionary
、およびSwiftおよびNSNumber
のさまざまな数値タイプにも当てはまると思います
Foundationタイプのいずれかを使用する必要がある場合はいつでも、var str: NSString = "An NSString"
のように変数/定数を明示的に入力するか、Swiftタイプの既存の変数/定数でbridgeToObjectiveC()
を使用できます。 str.bridgeToObjectiveC().length
たとえば。 str as NSString
を使用して、String
をNSString
にキャストすることもできます。
ただし、これらの手法がFoundation型、または少なくともその一部を明示的に使用する必要性は、言語リファレンスに記載されているものから、例えばString
/NSString
ブリッジが完全にシームレス。
このテーマの詳細については、 CocoaおよびObjective-CでのSwiftの使用:Cocoaデータ型の操作 を参照してください。
NSString:ヒープに常駐し、常に参照渡しされるオブジェクトを作成します。
文字列:渡すときは常に値型で、値渡しです。 StructやEnumのように、String自体はSwiftのStructです。
public struct String {
// string implementation
}
ただし、合格時にはコピーは作成されません。最初に変更したときにコピーを作成します。
文字列はNSStringとしてObjective-Cに自動的にブリッジされます。 Swift標準ライブラリにない場合、NSStringで定義されたメソッドにアクセスするには、Foundationフレームワークをインポートする必要があります。
Swift Stringは非常に強力で、多くの組み込み関数を備えています。
文字列の初期化:
var emptyString = "" // Empty (Mutable)
let anotherString = String() // empty String immutable
let a = String(false) // from boolean: "false"
let d = String(5.999) // " Double "5.99"
let e = String(555) // " Int "555"
// New in Swift 4.2
let hexString = String(278, radix: 18, uppercase: true) // "F8"
繰り返し値から文字列を作成します:
let repeatingString = String(repeating:"123", count:2) // "123123"
Swift 4->文字列は文字のコレクションです:
これで、StringはCollectionタイプで誰でも実行できるすべての操作を実行できます。
詳細については、Appleドキュメントを参照してください。
NSStringがフリーダイヤルでStringに変換することを指摘している他の人もいるように、Swiftネイティブ型とクラスを使用するのが最善の策です。
var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"
nsstring.length
count(string)
メソッドcount()を使用してstringの文字をカウントする必要があります。また、nsstring.lengthはUTF16に基づいて長さをカウントするため、2を返すことに注意してください。
同様、YES同じ、NO
String
とNSString
は交換可能であるため、どちらを使用するかは重要ではありません。を使用して、いつでも2つの間でキャストできます。
let s = "hello" as NSString
あるいは
let s: NSString = "hello"
NSInteger
はint
またはlong
(アーキテクチャによって異なります)のエイリアスなので、Int
を使用します。
NSDictionary
は完全に独立した実装であるため、Dictionary
は別の問題です。
一般に、可能であればいつでもSwift型に固執し、Swiftクラスが提供するbridgeToObjectiveC()
メソッドを使用して、必要に応じて2つの型をいつでも変換できます。
Objective Cの型はまだ動的にディスパッチされるため、おそらくより遅くなるでしょう。 Objective-C APIを操作する必要がない限り、Swiftネイティブタイプを使用するのが最適です。
できる限り、Swiftネイティブ型を使用してください。ただし、Stringの場合、次のようなすべてのNSString
メソッドに「シームレス」にアクセスできます。
var greeting = "Hello!"
var len = (greeting as NSString).length
文字列はSwift 4.でリビジョンを取得します。これで、直接countを呼び出すことができ、書記素クラスターは絵文字のように1つのピースと見なされます。 NSStringは更新されず、別の方法でカウントしています。
var nsstring: NSString = "????????????????"
var string: String = "????????????????"
print(nsstring.length) // 11
print(string.count) // 1