2016-10-01 8 views
28

NSクラスとNSクラス以外のクラスの違いは何ですか?特にNSDateDateNSはコアの​​周りに何らかのタイプのラッパーを表しますか?NSの機能はありませんか?スイフト3:日付とNSDate?

+0

の不在を持っていることを選んだABD、明らかな相違点を必要とそれは同じだと思う、AppleはNSDateをSwift 3のDateに変更するが、わからない。 –

答えて

42

スウィフト3は、このようなNSDateためDateNSDataといくつかのより多くのためのDataなどの既存 財団クラスタイプ、のためにいくつかの新しいオーバーレイ値の型を導入しました。完全なリストと詳細が

理由のいくつか

  • は、
  • letvarの代わりに、可変および不変のバリエーションを適切な値のセマンティクスを提供し、中に見つけることができます、
  • "Swifty" API。

新しいオーバーレイタイプは、対応する財団のタイプがあり すべての機能を提供する必要がありますが、必要であれば、あなた は常に他の型にキャストすることができます。

Swiftにインポートされた既存のFoundation APIが の場合、これらのタイプは自動的にブリッジされます。 DateNSDateに関して

Dateは値型 で一定又は可変とすることができる:NSDate一方

var date = Date() 
date += 10.0 // Add 10 seconds 

は、基準タイプと不変です。 NSDate Sのみ.compare()と比較することができる一方 もDateComparable

let date1 = Date() 
let date2 = Date() 

if date1 < date2 { } 

あります。

備考:これらの「オーバーレイタイプ」について、値型(構造体) などDateおよびその基礎相手(クラス)などNSDate は異なるタイプであり、両方がスイフトから使用することができます。 それはNSプレフィックスは、単に、例えば、特定の財団 クラスのためにドロップされました

と混同してはいけませんスウィフト3.クラスはObjective-Cのクラスである

+1

Martinに感謝します。 「標準的な」スウィフト開発を行う際にクラスを使用するためのガイドラインはありますか? –

+2

@MarcusLeon:Swiftは、既存のFoundation APIをインポートする際に既に新しいオーバーレイタイプに橋渡ししているので、新しいタイプを使用することをお勧めします。この利点は、私がリンクしている提案(適切な価値セマンティクスなど)に列挙されています。 - いくつかのメソッドが利用できない場合は、Foundation型にキャストして古いメソッドを呼び出すことができます。例:http://stackoverflow.com/questions/39519144/nslocale-swift-3 –

2

NSためBundleにに改名NSBundleです。Objective-CはiOSやMacOSアプリケーションの古いプログラミング言語であるため、Swiftではコード内でこれらのクラス構造体を使用することができます。したがって、必要に応じてObjective-CからSwiftにアプリケーションを移行することができます。

非NSクラスまたは構造体は、NSクラスまたは構造体の同等のSwiftです。この問題の詳細はhereまたはhereです。

Objective-CとSwift doは異なるプログラミング言語であるため、NSクラスと非NSクラスが完全に同じように動作しないことがあります。

-2

NSDateDateは同じものではありません。 NS(次のステップ)クラスはObjective-Cでのみ使用され、Objective-Cでは日付変数NSDateを表します。

特にSwift 3.0に関して、Swift Appleの最新リリースは、いずれのタイプにもNSプレフィックスを使用する必要性を完全に排除しました。 Swift 3では、NSDateの代わりにDateを使用します。コードをよりきれいに見せるために

+0

いいえ、それは別のことです。 'Date'と' NSDate'は同じ型ではありませんが、https://github.com/apple/swift-evolution/blob/master/proposals/0086-drop-foundation-ns.mdには含まれていません。 - SwiftではNSDateとDateの両方が使用可能です。 –

+0

すべてのNS型が非NS型アナログを持っているわけではありません。 – Rob

+4

NSデータはSwift 3のいくつかの場所、たとえばCore Dataで必要です。私は日付を格納する属性を持っています。 Date()を代入しようとすると、「 'Date'型の値を代入することはできません」というエラーが表示されますが、NSDateに代入すれば問題ありません。 (); coreDataEntity。date = theDate as NSDate – Scooter

0

NSクラスと非NSクラスの違いは、NSクラスが参照型であり、非NSクラスが値型である点です。スイフト3では、AppleはNSDateのようなFoundationクラスを導入してDateに再命名しましたが、参照タイプではなく値タイプに基づいているため、Dateは値タイプです。 例:

let date = NSDate() //1 
date.dateByAddingTimeInterval(1000) //2 

2。日付は定数ですが、可変性は変数を変数にするのではなく、クラスに依存しますが、許容されます。

let date = Date() //3 
date.dateByAddingTimeInterval(1000) //4 

4.に対し

は許可されていない許可されていませんとなり「日付」は、日付が日付(あると)「せ」値のタイプであるタイプと定数ましょうとしてエラーになります。

+0

マイナー解説:まず、これらの非 'NS'型のすべてが値の型(例えば、OperationとOperationQueue)であるとは限りません。しかし、はい、一般的にはそうですし、「日付」は確かです。第二に、「NS」以外の「クラス」を指すのは理にかなっていないことに留意することが大切です。その大半はクラスではないからです。それらのほとんどは 'struct'値型です。 – Rob

+1

'date'は定数であるが' dateByAddingTimeInterval'は 'Date'に存在しないので、2番目の引数は失敗しません。これに相当するのは 'date + 1000'です。これは合法です。 –

+0

ええ、4行目の 'Date'構文は' date.addingTimeInterval(1000) 'または' date + 1000'です... – Rob

1

スティーブ・ジョブスがアップルに呼び戻される前のNSは、より多くのサーフェス・リテラル・デザインの意味で、NextStepの日にすべてに与えられた接頭辞だったので、Objective- Cの構文。

スウィフトの発展に早送りに、彼らはそれがうまく(クリス・ラットナーのため)、接頭辞としてCLだったかもしれないが、明らかに私は、任意のプレフィックス