見出し画像

Swiftを始めよう! - Class 1

Classの作り方

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

"Shape"という名前のClassを作りました。内容は

var numberOfSides = 0   ・・・ プロパティ

func simpleDescription() -> String {
  return "A shape with \(numberOfSides) sides."   ・・・ メソッド
}

となっています。

使い方は

    var shape = Shape()

    shape.numberOfSides = 7

    var shapeDescription = shape.simpleDescription()


初期化をして使うクラス

    class NamedShape {
        var numberOfSides: Int = 0
        var name: String

        init(name: String) {
            self.name = name
        }

        func simpleDescription() -> String {
            return "A shape with \(numberOfSides) sides."
        }
    }

初期化はinitを使って、

init(name: String) {
  self.name = name
}

これで"Taro"という名前がプロパティnameに代入されます。引数の"name"と代入する変数のnameと違いが分かりにくいのでselfをつけても元からあるものと区別します。

使ってみます。

クラスを変数に入れて使えるようにします。

var nameShape = NamedShape(name:"Taro")

数字も変更してみます。

nameShape.numberOfSides = 9

あとは使うだけ。ちゃんと代入されているか、使えるかプロパティの中身とメソッドを動かします。

print(nameShape.name)   ・・・ プロパティ

print(nameShape.simpleDescription())  ・・・ メソッド

出力すると無事に代入したものが反映されています。


サブクラススーパークラス、 メソッドのオーバーライド

NamedShape()(スーパークラス )を利用してSquare(サブクラス)を作ります。あるものを利用して新しいものを作ることを日本語では継承と呼びます。

この場合NamedShapeの性質を持ったまま新しい機能の追加ができます。

    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)."
        }
    }

追加分。まずプロパティは

var sideLength: Double

イニシャライズinitは

init(sideLength: Double, name: String) {
  self.sideLength = sideLength  ・・・ 追加
  super.init(name: name)
  numberOfSides = 4  ・・・ 追加
}

継承元を使うときは"super.init"として定義します。

新しいメソッド

func area() -> Double {
  return sideLength * sideLength
}

そして上書きをいます。"override"をつけて定義します。

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()


プロパティのgetter と setter

NamedShapeを継承する EquilateralTriangleを作っています。



    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 triangle with sides of length \(sideLength)."
        }
    }



  var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
    print(triangle.perimeter)
    // Prints "9.3"
    triangle.perimeter = 9.9
    print(triangle.sideLength)
    // Prints "3.3000000000000003"



willSet and 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")
    print(triangleAndSquare.square.sideLength)
    // Prints "10.0"
    print(triangleAndSquare.triangle.sideLength)
    // Prints "10.0"
    triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
    print(triangleAndSquare.triangle.sideLength)
    // Prints "50.0"


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

この記事が気に入ったらサポートをしてみませんか?