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


109

Swiftの導入により、新しい言語に頭を悩ませてきました。

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

Swiftの型には、Foundationの型が行う機能の一部がない(または名前が異なる)ことに気づきました。たとえばNSStringlengthプロパティがあります。しかし、私はSwiftに似たものを見つけることができませんでしたString

iOSアプリケーションの場合、Foundationのタイプを引き続き使用する必要があるのでしょうか。


3
好むString。ただし、Stringアルファ版のリリースでは機能がまだ少し制限されているため、NSString当面はさらに使用する予定です。GAまでAPIが修正されることを期待しています。
スルタン

1
また、に電話してcountElements(str)、質問の特定の部分に回答することもできます。
ネイト・クック

"foo".length" directly in Swift. An implicit cast to NSString を呼び出すことができます`はコンパイラーによって追加されます!
Gabriele Petronella 2014年

1
@GabrielePetronella .lengthは、特殊文字では正しく機能しない場合があります。2つまたは3つのUnicode文字を使用する絵文字や中国語の文字など。countElementsは、使用する正しいメソッドです。
フォグマイスター2014年

回答:


98

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

一方でStringNSStringほとんど互換性があり、すなわち、あなたが渡すことができますString取るメソッドに変数をNSStringその逆のパラメータと副を、いくつかの方法が自動的にこの瞬間のよう橋渡しされていないように見えます。参照してくださいこの回答文字列の長さを取得する方法についての議論のためと、この答えは使用上の議論のためcontainsString()のサブストリングをチェックするために。(免責事項:私はこれらの両方の答えの作者です)

私は他のデータ型を完全には調査していませんが、上記のバージョンの一部はArray/ NSArrayDictionary/ NSDictionary、およびSwiftとNSNumber

Foundationの型の1つを使用する必要がある場合はいつでも、それらを使用して変数/定数を明示的に入力するか、Swift型の既存の変数/定数をvar str: NSString = "An NSString"使用できます。また、キャストすることができますに使用することによって。bridgeToObjectiveC()str.bridgeToObjectiveC().lengthStringNSStringstr as NSString

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

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


4
bridgeToObjectiveC()NSStringとSwiftの文字列の間の接続を参照および説明するための+1 。
Chris

2
cezarさん、回答を更新したい場合は、bridgeToObjectiveCは廃止されると思います。
Dan Beaulieu、2015年

Swift 3のマニュアルで、Foundationの型は参照によって渡されるのに対し、ネイティブの型は値によって渡されることに気づきました(または、現時点では完全に理解していないようなもの)。その意味を議論して回答を更新できればすばらしいと思います。
Nigel B. Peck

27

NSString:ヒープに常駐し、参照によって常に渡されるオブジェクトを作成します。

文字列:渡すときは常に値の型で、値によって渡されます。StructやEnumと同様に、String自体もSwiftのStructです。

public struct String {
 // string implementation 
}

ただし、合格するとコピーは作成されません。最初に変更したときにコピーが作成されます。

文字列は、NSStringとしてObjective-Cに自動的にブリッジされます。Swift標準ライブラリにない場合、Foundationフレームワークをインポートして、NSStringによって定義されたメソッドにアクセスする必要があります。

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は、コレクション型に対して誰でも実行できるすべての操作を実行できるようになりました。

詳細については、アップルのドキュメントを参照してください。


2
この回答は、より多くの賛成票を獲得するはずです。これは、StringとNSStringの根本的な違いです。それ以外の場所ではほとんど互換性があります
最大

すばらしい答えです。特に値と参照タイプのメモ。
spnkr

11

あなたの最善の策は、NSStringが文字列への無料の翻訳をしていると指摘しているように、Swiftネイティブ型とクラスを使用することですが、それらは100%同じではありません。

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

nsstring.length
count(string)

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

類似、はい同じ、いいえ


7

StringそしてNSString本当にあなたが使用しているかは重要ではありませんので、交換可能です。次を使用して、常に2つの間でキャストできます。

let s = "hello" as NSString

あるいは

let s: NSString  = "hello"

NSIntegerは(アーキテクチャに応じて)intまたはの単なるエイリアスなlongので、を使用しますInt

NSDictionaryDictionary完全に別の実装なので、別の問題です。

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


Intこの本では、Swiftのデータ型はアーキテクチャのワードサイズと同じであると記載されています。NSIntegerまた、アーキテクチャのワードサイズと同じサイズです。
MaddTheSane 2014年

6

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


はい、まさにその答えです。また、動的にディスパッチされるメソッドとオブジェクト変数へのアクセスを回避することで、WWDCで話し合ったこの速度の向上が実現します。以前は、パフォーマンスについて心配している人は全員、C ++文字列とコンテナを使用して静的ディスパッチを取得していました。
Lothar 2014年

5

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

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

4

Swift 4アップデート

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

var nsstring: NSString = "👩‍👩‍👧‍👦"
var string: String = "👩‍👩‍👧‍👦"

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

1
NSStrings書記素クラスタを処理するように更新されない可能性があります。古い動作に依存するアプリが多すぎて壊れてしまいます。また、NSString.lengthUTF16文字をカウントします。
MaddTheSane

0

文字列は構造体です

// Swiftモジュール内

public struct String

{

}

NSStringはクラスです

// Foundationモジュール

オープンクラスNSString:NSObject

{

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.