web-dev-qa-db-ja.com

Swift-使用するタイプは? NSStringまたはString

Swiftの導入により、新しい言語を理解しようとしています。

私はiOS開発者であり、アプリケーションでNSString, NSInteger, NSDictionaryなどのタイプを使用します。 Appleの「The Swift Programming Language」電子書籍では、SwiftタイプString, Int, Dictionaryを使用していることに気付きました。

Swift型には、Foundation型にある関数の一部がない(または異なる名前が付けられている)ことに気付きました。たとえば、NSStringにはlengthプロパティがあります。しかし、Swift Stringに類似したものを見つけることができませんでした。

IOSアプリケーションでは、Foundationタイプを引き続き使用する必要がありますか?

104
Alec

可能な限り、Swiftネイティブ型を使用する必要があります。言語はそれらを使用するように最適化されており、ほとんどの機能はネイティブ型とFoundation型の間でブリッジされています。

StringNSStringはほとんど互換性があります。つまり、String変数をNSStringパラメーターを取るメソッドに渡すことができますが、その逆もありますが、現時点では一部のメソッドは自動的にブリッジされないようです。文字列の長さを取得する方法については、 this answer および this answercontainsString()を使用して部分文字列をチェックする方法についての議論。 (免責事項:私はこれら両方の答えの著者です)

私は他のデータ型を完全には調査していませんが、上記のバージョンのいくつかのバージョンは、Array/NSArrayDictionary/NSDictionary、およびSwiftおよびNSNumberのさまざまな数値タイプにも当てはまると思います

Foundationタイプのいずれかを使用する必要がある場合はいつでも、var str: NSString = "An NSString"のように変数/定数を明示的に入力するか、Swiftタイプの既存の変数/定数でbridgeToObjectiveC()を使用できます。 str.bridgeToObjectiveC().lengthたとえば。 str as NSStringを使用して、StringNSStringにキャストすることもできます。

ただし、これらの手法がFoundation型、または少なくともその一部を明示的に使用する必要性は、言語リファレンスに記載されているものから、例えばString/NSStringブリッジが完全にシームレス。

このテーマの詳細については、 CocoaおよびObjective-CでのSwiftの使用:Cocoaデータ型の操作 を参照してください。

96
Cezar

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ドキュメントを参照してください。

24
Sandy Rawat

NSStringがフリーダイヤルでStringに変換することを指摘している他の人もいるように、Swiftネイティブ型とクラスを使用するのが最善の策です。

var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"

nsstring.length
count(string)

メソッドcount()を使用してstringの文字をカウントする必要があります。また、nsstring.lengthはUTF16に基づいて長さをカウントするため、2を返すことに注意してください。

同様、YES同じ、NO

11
Emanuel

StringNSStringは交換可能であるため、どちらを使用するかは重要ではありません。を使用して、いつでも2つの間でキャストできます。

let s = "hello" as NSString

あるいは

let s: NSString  = "hello"

NSIntegerintまたはlong(アーキテクチャによって異なります)のエイリアスなので、Intを使用します。

NSDictionaryは完全に独立した実装であるため、Dictionaryは別の問題です。

一般に、可能であればいつでもSwift型に固執し、Swiftクラスが提供するbridgeToObjectiveC()メソッドを使用して、必要に応じて2つの型をいつでも変換できます。

7

Objective Cの型はまだ動的にディスパッチされるため、おそらくより遅くなるでしょう。 Objective-C APIを操作する必要がない限り、Swiftネイティブタイプを使用するのが最適です。

6
Jiaaro

できる限り、Swiftネイティブ型を使用してください。ただし、Stringの場合、次のようなすべてのNSStringメソッドに「シームレス」にアクセスできます。

var greeting = "Hello!"
var len = (greeting as NSString).length
5
Nate Cook

Swift 4アップデート

文字列はSwift 4.でリビジョンを取得します。これで、直接countを呼び出すことができ、書記素クラスターは絵文字のように1つのピースと見なされます。 NSStringは更新されず、別の方法でカウントしています。

var nsstring: NSString = "????‍????‍????‍????"
var string: String = "????‍????‍????‍????"

print(nsstring.length) // 11
print(string.count)    // 1
4
Fangming