プロパティの (価) 値
前回予告したとおり,
しかしそもそも
iOSの辞書によると
値の中の値
それではSwiftにおけるプロパティとはいったいなんでしょうか? 断言する前に実例を見てみましょう。Playgroundで次を入力してみてください。
"swift".description // "swift"
(42).description // "42"
(42.195).description // "42.195"
[42].description // "[42]"
["swift":4.1].description
// "["swift": 4.0999999999999996]"
それぞれの値を文字列にしたものが""
に囲まれて表示されているはずです。これがそれぞれの値.description
という名のプロパティ
今度は.description
を.hashValue
にしてみましょう。String
やInt
やDouble
ではこのようにInt
の値が出てきますが……,
"swift".hashValue // 4799434080856491603 (42).hashValue // 42 (42.195).hashValue // 4631135235630652457
Array
やDictionary
だとエラーになります
図2 ArrayやDictionaryではエラー発生
[42].hashValue // error: value of type '[Int]' has no member 'hashValue' ["swift":4.1].hashValue // error: value of type '[String : Double]' has no member 'hashValue'
どんな値がどんなプロパティを持つかは,
今そこにあるプロパティ・ その場で作られるプロパティ
プロパティは型によって決まる。具体的にその様子を見てみましょう。
struct Point<T:FloatingPoint> {
var x:T
var y:T
}
Point
というStruct
を作ったうえで使ってみます。
var dp = Point(x:3,y:4) dp.x // 3 dp.y // 4
.x
と.y
というプロパティが存在し,
このPoint
に原点.distance
というプロパティを付け加えてみましょう。
import Darwin // for sqrt()
extension Point {
var distance:T {
return sqrt(x*x + y*y)
}
}
実行結果は次のとおり。
dp.distance // 5
メモリにそのまま保持されているストアド・
「あれ? これってメソッド
extension Point {
func getDistance() -> T {
return sqrt(x*x + y*y)
}
}
dp.getDistance() // 5
ここで.getDistance()
の()
を取ってみましょう。エラーにはならず,() -> Double
と出てくるはずです。
そうなのです。Swiftではメソッドもまた単なる関数型のストアド・()
を付けずに実行されるメソッドにすぎないのです。
しかし,
.distance
の定義を次のように変えてみます。
extension Point {
var distance:T {
get {
return sqrt(x*x + y*y)
}
set {
let d = distance
x *= newValue / d
y *= newValue / d
}
}
}
すると……,
dp.distance = 10 dp.x // 6 dp.y // 8
これは,
extension Point {
func getDistance() -> T {
return sqrt(x*x + y*y)
}
mutating func setDistance(_ newValue:T) {
let d = self.getDistance()
x *= newValue / d
y *= newValue / d
}
}
ほかの言語でも,()
の有無に過ぎず,