Swiftの変数と定数を深く理解する
5288 ワード
前言
最近、Swiftという新しい言語を勉強しているので、OCプログラミングをマスターしているiOS開発者にとっては簡単に手に入ることができますが、Swiftは確かに文法やプログラミング習慣がずいぶん変わっています.OC言語を知らずにSwiftからiOS開発を学ぶ初心者にとっては難しいかもしれません.ここでは、この時間の学習成果をインターネットで検索した知識と結びつけて簡単にまとめて、Swiftを勉強している仲間たちに助けてほしいと思います.
変数と定数の定義
Swift開発ドキュメントでは、定数と定数を定義します.定数と変数は、名前と特定のタイプの値を関連付けます.定数の値は一度設定すると変更できませんが、変数は将来異なる値に設定できます(名前と意味を参照して、簡単です).
変数定数の宣言方法
定数と変数は、使用前に宣言され、キーワードletを使用して定数を宣言し、キーワードvarを使用して変数を宣言する必要があります.簡単な例を挙げます.
ここではPersonクラスがNSObjectを継承しています.明らかに人間の生命は変えられない定数に設定すべきですが、人間の年齢は時間とともに変数として宣言すべきです.同じように、開発中に類似のニーズがある場合は、変数をいつ使用するか、定数をいつ使用するかを選択する必要があります.もちろん、1行のコードをカンマで区切った形式で複数の簡単な変数または定数を次のように指定できます.
ここではSwiftにおけるタイプセキュリティとタイプ推定について説明する必要がある.Swiftは、コードが処理する必要がある値のタイプを常に認識しなければならないタイプの安全な言語です.コンパイラはタイプチェックを行い、一致しないタイプはエラーとしてマークされます.もちろん、演算に参加できません.異なるタイプの値を操作すると、タイプチェックはエラーを回避するのに役立ちます.もちろん、すべての変数と定数が特定のタイプを明確に指摘する必要はありません.明示的な変数や定数にタイプを指定していない場合、Swiftはタイプ推定の機能を使用して適切なタイプを推定します.変数に付与された値をチェックすることで、タイプ推定はコンパイル段階で自動的に値を推定できるタイプです.これがSwiftのタイプ推定です.上記の変数a,b,cを連続的に宣言するコードではa,b,cのタイプを明確に指摘していないように,コンパイラはa,b,cに与えられた値からa,b,cのタイプをそれぞれIntタイプ,Doubleタイプ,Stringタイプと推定する.
しかし、必要に応じて、宣言された変数または定数にタイプ寸法を提供し、格納できる値を明確にする必要があります.タイプ表示を追加する方法は、変数または定数の名前の後にコロンを付け、スペースを付け、最後に使用するタイプ名を付けます(ここではOCとは異なり、適応する必要があります).以下に示すコード効果は、実は上と同じです.
変数のタイプが同じであれば、次のように説明することもできます.
変数と定数の名前付け
定数と変数の名前は、Unicode文字を含むほとんどの文字を使用できます.
ただし、定数と変数の名前には、空白文字、数学記号、矢印、保持されている(または無効な)Unicodeコードビット、配線、タブを含めることはできません.数字で始まることもできませんが、数字はほとんど名前の他のどこにでも使えます.特定のタイプの定数または変数を宣言すると、同じ名前で再度宣言することはできません.また、他のタイプの値を変更することはできません.定数と変数の間でも交換できません.Swiftが保持しているキーワードを使用して定数または変数に名前を付ける必要がある場合は、逆引用符(`)で囲むことで名前を付けることができます.要するに、選択肢がない限り、キーワードを名前として使用することを避けます.確かに選択肢がない限り(ドキュメント翻訳から引用して、何も言うことはありません...).
まとめると、Swiftの変数と定数の命名はOCよりも柔軟で変化していますが、上記の規定に注意する必要があります.また、開発者間の協力を容易にするために、彼らの命名はできるだけ名前を見て意識するようにしています.ここではSwiftの主なキーワードを挙げて、名前をつけるときにできるだけ避けてほしいと思います.宣言のキーワードとして使用:
文のキーワードとして使用:
表現とタイプのキーワードとして使用します.
特定のコンテキストに保持されているキーワード:
変数定数の本質的な違い
上の学習を経て、私たちはすでに定数と変数を熟練して使用することができて、それでは定数と変数の本質の違いはいったい何ですか?ここでは例を挙げて説明します.
1行目のコードの意味:まずメモリ内のスタック領域にメモリアドレス0 x 7 faa 31616 bb 0のUIViewタイプのオブジェクトを作成し、メモリ内のスタック領域にview 0という定数がオブジェクトを指していることを明らかにします.すなわち、view 0に保存されているのは0 x 7 faa 31616 bb 0であり、定数の値は可変ではありません.(これはくだらないことではありませんか)、すなわちview 0に保存されているメモリアドレスは変更できません.
2行目のコードの意味:スタック領域に新しいメモリアドレス0 x 7 f 9890 c 062 b 0のUIViewタイプのオブジェクトを作成し、スタック領域にview 1という変数がオブジェクトを指すことを明らかにします.すなわち、view 0に保存されているのは0 x 7 faa 31616 bb 0というアドレスです.view 1の値は変更可能であり、view 1に保存されているメモリアドレスは変更可能であることに注意してください.
次の操作を行います.
コンパイラはこのようなエラーを報告します.
主に作成された新しいオブジェクトには新しいメモリアドレスがあるため、view 0に新しいオブジェクトを再割り当てます.すなわち、view 0は現在別のオブジェクトを指しています.view 0に格納されていた0 x 7 faa 31616 bb 0のメモリアドレスを0 x 7 f 9890 c 042 b 0に変更することに相当しますが、view 0に格納されているメモリアドレスはいったん割り当てられたら変更できません.したがって、コンパイラはここでエラーを報告します.彼はletをvarに変えてview 0を明らかにすることを提案した.
view 1に保存されているメモリアドレスは変更可能なので、ここでは間違いは報告されません.
しかし、もし私が次のコードを実行したら、コンパイラは間違っていませんか?
2つのコードの意味:まずview 0の背景色を白に設定し、view 0の背景色を黒に変更する(Swift 2.0とSwift 3.0の背景色を変更する方法は異なり、ここではSwift 3.0を使用しているが、コードを簡略化しているだけで、本質的な違いはない)
答えはできません.上の操作ではview 0に保存されているメモリアドレスを変更していません.view 0に保存されているメモリアドレスを通じてview 0が指すオブジェクトを手に入れ、オブジェクト内部の属性(ここではbackgroundColor、frameなど)を変更します.view 0が定数なのか変数なのかは関係ありません.
まとめ
定数の値が変更できない本質は、保存されているメモリアドレスが変更できないことですが、アドレスが指すオブジェクトを取得し、オブジェクトのプロパティを変更することができます.
変数の値を変更できる本質は、保存されているメモリアドレスが変更できることです.
はい、以上はこの文章のすべての内容で、本文の内容がみんなの学习あるいは仕事に対して一定の助けをもたらすことができることを望んで、もし疑问があればみんなは伝言を残して交流することができます.
最近、Swiftという新しい言語を勉強しているので、OCプログラミングをマスターしているiOS開発者にとっては簡単に手に入ることができますが、Swiftは確かに文法やプログラミング習慣がずいぶん変わっています.OC言語を知らずにSwiftからiOS開発を学ぶ初心者にとっては難しいかもしれません.ここでは、この時間の学習成果をインターネットで検索した知識と結びつけて簡単にまとめて、Swiftを勉強している仲間たちに助けてほしいと思います.
変数と定数の定義
Swift開発ドキュメントでは、定数と定数を定義します.定数と変数は、名前と特定のタイプの値を関連付けます.定数の値は一度設定すると変更できませんが、変数は将来異なる値に設定できます(名前と意味を参照して、簡単です).
変数定数の宣言方法
定数と変数は、使用前に宣言され、キーワードletを使用して定数を宣言し、キーワードvarを使用して変数を宣言する必要があります.簡単な例を挙げます.
class Person: NSObject {
let life = 1
var age = 0
}
ここではPersonクラスがNSObjectを継承しています.明らかに人間の生命は変えられない定数に設定すべきですが、人間の年齢は時間とともに変数として宣言すべきです.同じように、開発中に類似のニーズがある場合は、変数をいつ使用するか、定数をいつ使用するかを選択する必要があります.もちろん、1行のコードをカンマで区切った形式で複数の簡単な変数または定数を次のように指定できます.
var a = 0, b = 1.0, c = "CoderYQ"
ここではSwiftにおけるタイプセキュリティとタイプ推定について説明する必要がある.Swiftは、コードが処理する必要がある値のタイプを常に認識しなければならないタイプの安全な言語です.コンパイラはタイプチェックを行い、一致しないタイプはエラーとしてマークされます.もちろん、演算に参加できません.異なるタイプの値を操作すると、タイプチェックはエラーを回避するのに役立ちます.もちろん、すべての変数と定数が特定のタイプを明確に指摘する必要はありません.明示的な変数や定数にタイプを指定していない場合、Swiftはタイプ推定の機能を使用して適切なタイプを推定します.変数に付与された値をチェックすることで、タイプ推定はコンパイル段階で自動的に値を推定できるタイプです.これがSwiftのタイプ推定です.上記の変数a,b,cを連続的に宣言するコードではa,b,cのタイプを明確に指摘していないように,コンパイラはa,b,cに与えられた値からa,b,cのタイプをそれぞれIntタイプ,Doubleタイプ,Stringタイプと推定する.
しかし、必要に応じて、宣言された変数または定数にタイプ寸法を提供し、格納できる値を明確にする必要があります.タイプ表示を追加する方法は、変数または定数の名前の後にコロンを付け、スペースを付け、最後に使用するタイプ名を付けます(ここではOCとは異なり、適応する必要があります).以下に示すコード効果は、実は上と同じです.
var a: Int = 0
var b: Double = 1.0
var c: String = "CoderYQ"
変数のタイプが同じであれば、次のように説明することもできます.
var a, b, c : Double
変数と定数の名前付け
定数と変数の名前は、Unicode文字を含むほとんどの文字を使用できます.
let π = 3.14159
let = " "
let = "dog cow"
ただし、定数と変数の名前には、空白文字、数学記号、矢印、保持されている(または無効な)Unicodeコードビット、配線、タブを含めることはできません.数字で始まることもできませんが、数字はほとんど名前の他のどこにでも使えます.特定のタイプの定数または変数を宣言すると、同じ名前で再度宣言することはできません.また、他のタイプの値を変更することはできません.定数と変数の間でも交換できません.Swiftが保持しているキーワードを使用して定数または変数に名前を付ける必要がある場合は、逆引用符(`)で囲むことで名前を付けることができます.要するに、選択肢がない限り、キーワードを名前として使用することを避けます.確かに選択肢がない限り(ドキュメント翻訳から引用して、何も言うことはありません...).
まとめると、Swiftの変数と定数の命名はOCよりも柔軟で変化していますが、上記の規定に注意する必要があります.また、開発者間の協力を容易にするために、彼らの命名はできるだけ名前を見て意識するようにしています.ここではSwiftの主なキーワードを挙げて、名前をつけるときにできるだけ避けてほしいと思います.宣言のキーワードとして使用:
class、deinit、enum、extension、func、import、init、let、protocol、static、struct、subscript、typealias、var
文のキーワードとして使用:
break、case、continue、default、do、else、fallthrough、if、in、for、return、switch、where、while
表現とタイプのキーワードとして使用します.
as、dynamicType、is、new、super、self、Self、Type、__COLUMN__、__FILE__、__FUNCTION__、__LINE__
特定のコンテキストに保持されているキーワード:
associativity、didSet、get、infix、inout、left、mutating、none、nonmutating、operator、override、postfix、precedence、prefix、right、set、unowned、unowned(safe)、unowned(unsafe)、weak、willSet
変数定数の本質的な違い
上の学習を経て、私たちはすでに定数と変数を熟練して使用することができて、それでは定数と変数の本質の違いはいったい何ですか?ここでは例を挙げて説明します.
// UIView() UIView ( :0x7faa31616bb0) UIView :view0
let view0 : UIView = UIView()
// UIView() UIView ( :0x7f9890c062b0) UIView :view1
var view1 : UIView = UIView()
1行目のコードの意味:まずメモリ内のスタック領域にメモリアドレス0 x 7 faa 31616 bb 0のUIViewタイプのオブジェクトを作成し、メモリ内のスタック領域にview 0という定数がオブジェクトを指していることを明らかにします.すなわち、view 0に保存されているのは0 x 7 faa 31616 bb 0であり、定数の値は可変ではありません.(これはくだらないことではありませんか)、すなわちview 0に保存されているメモリアドレスは変更できません.
2行目のコードの意味:スタック領域に新しいメモリアドレス0 x 7 f 9890 c 062 b 0のUIViewタイプのオブジェクトを作成し、スタック領域にview 1という変数がオブジェクトを指すことを明らかにします.すなわち、view 0に保存されているのは0 x 7 faa 31616 bb 0というアドレスです.view 1の値は変更可能であり、view 1に保存されているメモリアドレスは変更可能であることに注意してください.
次の操作を行います.
// UIView ( :0x7f9890c042b0) view0
view0 = UIView()
コンパイラはこのようなエラーを報告します.
error: cannot assign to value: 'view0' is a 'let' constant,change 'let' to 'var' to make it mutable
主に作成された新しいオブジェクトには新しいメモリアドレスがあるため、view 0に新しいオブジェクトを再割り当てます.すなわち、view 0は現在別のオブジェクトを指しています.view 0に格納されていた0 x 7 faa 31616 bb 0のメモリアドレスを0 x 7 f 9890 c 042 b 0に変更することに相当しますが、view 0に格納されているメモリアドレスはいったん割り当てられたら変更できません.したがって、コンパイラはここでエラーを報告します.彼はletをvarに変えてview 0を明らかにすることを提案した.
// UIView ( :0x7f9890c042b0) view1
view1 = UIView()
view 1に保存されているメモリアドレスは変更可能なので、ここでは間違いは報告されません.
しかし、もし私が次のコードを実行したら、コンパイラは間違っていませんか?
view0.backgroundColor = UIColor.white
view0.backgroundColor = UIColor.black
2つのコードの意味:まずview 0の背景色を白に設定し、view 0の背景色を黒に変更する(Swift 2.0とSwift 3.0の背景色を変更する方法は異なり、ここではSwift 3.0を使用しているが、コードを簡略化しているだけで、本質的な違いはない)
答えはできません.上の操作ではview 0に保存されているメモリアドレスを変更していません.view 0に保存されているメモリアドレスを通じてview 0が指すオブジェクトを手に入れ、オブジェクト内部の属性(ここではbackgroundColor、frameなど)を変更します.view 0が定数なのか変数なのかは関係ありません.
まとめ
定数の値が変更できない本質は、保存されているメモリアドレスが変更できないことですが、アドレスが指すオブジェクトを取得し、オブジェクトのプロパティを変更することができます.
変数の値を変更できる本質は、保存されているメモリアドレスが変更できることです.
はい、以上はこの文章のすべての内容で、本文の内容がみんなの学习あるいは仕事に対して一定の助けをもたらすことができることを望んで、もし疑问があればみんなは伝言を残して交流することができます.