2014年07月09日
Posted by 屋台ブルー at
2014年07月09日15:17 Comment(0)
Swiftで遊ぼう! - 1 class and structure
2014年9月25日追記
The Swift Programming Language本の2回目の改訂が9月18日にされたんで、再び読み返している。この記事を書いた時の疑問点は、ちゃんと正本で説明されていたよ。納得できないけど、ルールはルールとして頭にいれないといけないですね。構造型(Strructure型)は基本的に値保持をするので、インスタンスが生成された時点でメモリーが確保される。この場合、例え「var」変数宣言をしたプロパティを持つ構造型を「let」定数値として宣言したらプロパティは定数になってしまうので変更できなくなる。逆にクラス型は、基本的にリファレンスタイプなので、インスタンス宣言した時に保持されたメモリー空間を指定(ポインタ的ですよね)したことを定数宣言しているので、参照される先(プロパティ)に影響は及ばないので、変数宣言さたプロパティならば変更できると言うことだろう。私みたいなオヤジになると、こういう概念が頭にすーっと入ってこないんですよね。でも、何となく理解したということにします。たぶん、忘れてしまうので、3回目の精読時にもう一度チェックしなきゃね。
-----
WWDC2014で発表された新しいプログラミング言語、Swiftが気になる。Xcode6で新たに加わったPlaygroundsを見ていると、おっと、プログラミングに挫折した私でも遊べるんじゃないかと思えてきた! 教科書にあたる"The Swift Pragramming Langage"って本は、iBooks Storeで無料で配られてるじゃないですか! 英語が読めるのなら、単語数や文法も単純なSwiftは楽勝じゃないかと考えながら読み進めてみたけど、やっぱり今時のモダンプログラミングの概念にやられている。
脱アルゴリズムの関数型プログラミング、なんとなく解るようなわからないような...
Playgraoudsで遊んでみよう。ポインターなんて解らないし、クラスやインスタンスもイマイチ理解できていないけど適当にやってみることにしよう。それがPlaygroundsの利用法だろう。
「The Swift Programming Language」もまだ全て読み切ったわけじゃないけど、適当に読みながらPlaygroundsで実験、実験。
Classes and Structuresにある例文から、
-----
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let someResolution = Resolution()
let someVideoMode = VideoMode()
println("The width of someResolution is \(someResolution.width)")
println("The width of someVideoMode is \(someVideoMode.resolution.width)")
someVideoMode.resolution.width = 1280
println("The width of someVideoMode is now \(someVideoMode.resolution.width)")
//The width of someVideoMode is now 1280
ここまでではなんとなくわかる。someVideoModeのプロパティにResolutionのプロパティであるwidthが使われている。このクラスはインスタンスになるんで、このwidthのプロパティは新たに作られている(メモリーが振られてる?)ので、上記のsomeVideoMode.resolution.width = 1280とvalueを変更してやることができるということは何となくわかる。
println("The widht of someResolution is now \(someResolution.width)")
//The widht of someResolution is now 0
上のようにオリジナルのstructuresであるsomeResolution.widthは1280にはなっていないで、デフォルトである0のままってのも理解できる。
someResolution.width = 960
とStructuresのvalueを変更してみようとしたけど、assignエラーが出ました!
よく考えると、someResolutionは「let」で宣言しているんで、一度宣言した定数は変更できないんだ。なんて思ったけど、「let」で宣言しているsomeVideoModeはどうして、プロパティを変更できるのかだろうか??? クラスのインスタンスとして定数だけど、プロパティは変数宣言しているんで変更できる???
元の宣言で、let someResolution = Resolution()をvar someResolution = Resolution()にしてみる。
var someResolution = Resolution()
println("The widht of someResolution is now \(someResolution.width)")
someResolution.width = 960
println("The width of someResolution is now \(someResolution.width)")
//The widht of someResolution is now 0
//The width of someResolution is now 960
やっぱり!、プロパティを変更できた! やっぱり定数宣言したStructureは後で変更できないんだ。でもClassの場合は定数宣言しても、プロパティを変更できるというのは、Cインスタンスを生成しているから??? なにかあるんだろうけど理解できない。引っかかるが、今は疑問として残しておこう。
The Swift Programming Language本の2回目の改訂が9月18日にされたんで、再び読み返している。この記事を書いた時の疑問点は、ちゃんと正本で説明されていたよ。納得できないけど、ルールはルールとして頭にいれないといけないですね。構造型(Strructure型)は基本的に値保持をするので、インスタンスが生成された時点でメモリーが確保される。この場合、例え「var」変数宣言をしたプロパティを持つ構造型を「let」定数値として宣言したらプロパティは定数になってしまうので変更できなくなる。逆にクラス型は、基本的にリファレンスタイプなので、インスタンス宣言した時に保持されたメモリー空間を指定(ポインタ的ですよね)したことを定数宣言しているので、参照される先(プロパティ)に影響は及ばないので、変数宣言さたプロパティならば変更できると言うことだろう。私みたいなオヤジになると、こういう概念が頭にすーっと入ってこないんですよね。でも、何となく理解したということにします。たぶん、忘れてしまうので、3回目の精読時にもう一度チェックしなきゃね。
-----
WWDC2014で発表された新しいプログラミング言語、Swiftが気になる。Xcode6で新たに加わったPlaygroundsを見ていると、おっと、プログラミングに挫折した私でも遊べるんじゃないかと思えてきた! 教科書にあたる"The Swift Pragramming Langage"って本は、iBooks Storeで無料で配られてるじゃないですか! 英語が読めるのなら、単語数や文法も単純なSwiftは楽勝じゃないかと考えながら読み進めてみたけど、やっぱり今時のモダンプログラミングの概念にやられている。
脱アルゴリズムの関数型プログラミング、なんとなく解るようなわからないような...
Playgraoudsで遊んでみよう。ポインターなんて解らないし、クラスやインスタンスもイマイチ理解できていないけど適当にやってみることにしよう。それがPlaygroundsの利用法だろう。
「The Swift Programming Language」もまだ全て読み切ったわけじゃないけど、適当に読みながらPlaygroundsで実験、実験。
Classes and Structuresにある例文から、
-----
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let someResolution = Resolution()
let someVideoMode = VideoMode()
println("The width of someResolution is \(someResolution.width)")
println("The width of someVideoMode is \(someVideoMode.resolution.width)")
someVideoMode.resolution.width = 1280
println("The width of someVideoMode is now \(someVideoMode.resolution.width)")
//The width of someVideoMode is now 1280
ここまでではなんとなくわかる。someVideoModeのプロパティにResolutionのプロパティであるwidthが使われている。このクラスはインスタンスになるんで、このwidthのプロパティは新たに作られている(メモリーが振られてる?)ので、上記のsomeVideoMode.resolution.width = 1280とvalueを変更してやることができるということは何となくわかる。
println("The widht of someResolution is now \(someResolution.width)")
//The widht of someResolution is now 0
上のようにオリジナルのstructuresであるsomeResolution.widthは1280にはなっていないで、デフォルトである0のままってのも理解できる。
someResolution.width = 960
とStructuresのvalueを変更してみようとしたけど、assignエラーが出ました!
よく考えると、someResolutionは「let」で宣言しているんで、一度宣言した定数は変更できないんだ。なんて思ったけど、「let」で宣言しているsomeVideoModeはどうして、プロパティを変更できるのかだろうか??? クラスのインスタンスとして定数だけど、プロパティは変数宣言しているんで変更できる???
元の宣言で、let someResolution = Resolution()をvar someResolution = Resolution()にしてみる。
var someResolution = Resolution()
println("The widht of someResolution is now \(someResolution.width)")
someResolution.width = 960
println("The width of someResolution is now \(someResolution.width)")
//The widht of someResolution is now 0
//The width of someResolution is now 960
やっぱり!、プロパティを変更できた! やっぱり定数宣言したStructureは後で変更できないんだ。でもClassの場合は定数宣言しても、プロパティを変更できるというのは、Cインスタンスを生成しているから??? なにかあるんだろうけど理解できない。引っかかるが、今は疑問として残しておこう。