struct FixedLengthRange {
   var firstValue: Int
   let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// jangkuan tersebut memakili nilai integer 0, 1, dan 2
rangeOfThreeItems.firstValue = 6
// jangkuan tersebut sekarang memakili nilai integer 6, 7, dan 8
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// jangkuan tersebut memakili nilai integer 0, 1, dan 2
rangeOfFourItems.firstValue = 6
// ini akan menimbulkan kesalahan, meskipun firstValue adalah properti variabel
class DataImporter {
   /*
   DataImporter adalah class untuk mengimpor data dari berkas eksternal.
   Class ini diasumsikan akan mengambil jumlah waktu yang tidak ditentukan untuk diinisialisasi.
   */
   var filename = "data.txt"
   // class DataImporter akan menyediakan fungsionalitas pengimporan data di sini
}
class DataManager {
   lazy var importer = DataImporter()
   var data = [String]()
   // class DataManager akan menyediakan fungsionalitas manajemen data di sini
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// instance DataImporter untuk properti 
print(manager.importer.filename)
// instance DataImporter untuk properti importer kini telah dibuat
// Menyetak "data.txt"
struct Point {
  var x = 0.0, y = 0.0
}
 
struct Shape {
  var origin = Point()  
  var center: Point {
    get {
      return Point(x: origin.x/2 , y: origin.y/2)
    }
    set(newCenter) {
      origin.x = newCenter.x/2
      origin.y = newCenter.y/2
    }
  }
}
struct Point {
  var x = 0.0, y = 0.0
}
 
struct Shape {
  var origin = Point()  
  var center: Point {
    get {
     return Point(x: origin.x/2, y: origin.y/2)
    }
    set {
     origin.x = newValue.x/2
     origin.y = newValue.y/2
    }
 }
}
struct Cuboid {
   var width = 0.0, height = 0.0, depth = 0.0
   var volume: Double {
       return width * height * depth
   }
}
 
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// Prints "the volume of fourByFiveByTwo is 40.0"
// CONTOH
class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newSteps) {
            print("About to set totalSteps to \(newSteps)")
        }
        didSet {
            if totalSteps > oldValue {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
 
let stepCounter = StepCounter()
 
stepCounter.totalSteps = 50
// About to set totalSteps to 50
// Added 50 steps
stepCounter.totalSteps = 150
// About to set totalSteps to 150
// Added 100 steps
 
stepCounter.totalSteps = 420
// About to set totalSteps to 420
// Added 270 steps
// KUNCI STATIC
struct SomeStructure {
   static var storedTypeProperty = "Some value."
   static var computedTypeProperty: Int {
       return 1
   }
}
 
enum SomeEnumeration {
   static var storedTypeProperty = "Some value."
   static var computedTypeProperty: Int {
       return 6
   }
}
 
class SomeClass {
   static var storedTypeProperty = "Some value."
   static var computedTypeProperty: Int {
       return 27
        }
   class var overrideableComputedTypeProperty: Int {
       return 107
   }
}
print(SomeStructure.storedTypeProperty)
// Prints "Some value."
SomeStructure.storedTypeProperty = "Another value."
print(SomeStructure.storedTypeProperty)
// Prints "Another value."
print(SomeEnumeration.computedTypeProperty)
// Prints "6"
print(SomeClass.computedTypeProperty)
// Prints "27"