プロパティー

トップページ » プロパティー

20 Jun 2014 03:00公開

※「プロパティー」はまだ工事中です。まず「Swiftの全貌を探る」シリーズの記事を参考してください。

Swiftのオブジェクトとクラスを紹介します。

オブジェクトとクラス

クラスの定義

class Shape {
 var numberOfSides = 0
 func simpleDescription() -> String {
  return "A shape with \(numberOfSides) sides."
 }
}

クラス名()でインスタンス(オブジェクト)の作成

var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()

コンストラクター、デストラクターとプロパティー

initはコンストラクターで、つまり初期化を行うメソッドです。
deinitデストラクターで、オブジェクト終了のとき実行されます。
self.でプロパティーとメソッドのパラメーターを区別します。

class NamedShape {
 var numberOfSides: Int = 0
 var name: String
 init(name: String) {
  self.name = name
 }
 func simpleDescription() -> String {
  return "A shape with \(numberOfSides) sides."
 }
}

継承とオーバーライド

継承はコロン:親クラス名で表記します。
overrideでメソッドをオーバーライドします。

class Square: NamedShape {
 var sideLength: Double
 init(sideLength: Double, name: String) {
  self.sideLength = sideLength
  super.init(name: name)
  numberOfSides = 4
 }
 func area() -> Double {
  return sideLength * sideLength
 }
 override func simpleDescription() -> String {
  return "A square with sides of length \(sideLength)."
 }
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

プロパティーのアクセサー

プロパティーに対して、アクセサーのゲッター、セッターをつけることができます。
セッターなかで 、新しい値は、暗黙的な名前がnewValue 。また、setキーワード後ろの括弧内に明示的な名前を与えることができます。

class EquilateralTriangle: NamedShape {
 var sideLength: Double = 0.0
 init(sideLength: Double, name: String) {
  self.sideLength = sideLength
  super.init(name: name)
  numberOfSides = 3
 }
 var perimeter: Double {
  get {
   return 3.0 * sideLength
  }
  set {
   sideLength = newValue / 3.0
  }
 }
 override func simpleDescription() -> String {
  return "An equilateral triagle with sides of length \(sideLength)."
 }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength

willSet, didSet

プロパティーの計算は必要ないが、新しい値設定の前と後に実行するコードを設定したければ、willSet、didSetをりおゆすればいいです。下記のサンプルは三角形の辺の長さを正方形の辺の長さと同じように調整する。

class TriangleAndSquare {
 var triangle: EquilateralTriangle {
  willSet {
   square.sideLength = newValue.sideLength
  }
 }
 var square: Square {
  willSet {
   triangle.sideLength = newValue.sideLength
  }
 }
 init(size: Double, name: String) {
  square = Square(sideLength: size, name: name)
  triangle = EquilateralTriangle(sideLength: size, name: name)
 }
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLength

メソッドのパラメーターの別名

関数のパラメーターと違って、メソッドのパラメーターは別名をつけることができます。パラメーター名 別名の形で表記します。
メモ:この機能は既存のObject-Cクラスの互換性を維持するために設定されたと思います。

class Counter {
 var count: Int = 0
 func incrementBy(amount: Int, numberOfTimes times: Int) {
  count += amount * times
 }
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)

オプショナルの値を使う

メソッド、プロパティー、サブスクリプト(subscripting)に対して、はてな ? をつけることで、はてな前の値はnilの場合、後ろの処理を省略することができます。

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength

シリーズ

記事のリスト

  • プロパティー

レーティング

rating: 0+x

コメント

Add a New Comment
当サイトコンテンツライセンスについて個別な指定がなければCreative Commons Attribution-ShareAlike 3.0 Licenseをベースします。転載や引用は大歓迎です。但し、転載・引用・二次利用の場合は当サイト記事へのURLをリンクし出典を明記してください。各作品を大切にして下さい。 また、記事及びコメントを投稿する皆さまも上記のライセンスを理解した上投稿して下さい。 当サイトのコンテンツは皆さまの投稿で作成されますから、当サイトの意思を反映しておりませんが、第三者の知的財産権などの侵害がある場合、当サイトの運営担当にご連絡ください。