swift 4.2 Dynamic Member Lookup

Swift 4.1 ile birlikte sınıflarımız için subscript metodları tanımlayabiliyorduk, bu şekilde tırnak işareti kullanarak içerikleri özelleştirilmiş olarak çağrılabiliyor.

class Person {
  let name: String
  let age: Int
  private let details: [String: String]

  init(name: String, age: Int, details: [String: String]) {
    self.name = name
    self.age = age
    self.details = details
  }

  subscript(key: String) -> String {
    switch key {
      case "info":
        return "\(name) is \(age) years old."
      default:
        return details[key] ?? ""
    }
  }
}

let details = ["title": "Author", "instrument": "Guitar"]
let me = Person(name: "Cosmin", age: 32, details: details)
me["info"]   // "Cosmin is 32 years old."
me["title"]  // "Author"

yeni gelen @dynamicMemberLookup özelliği ile nasıl olduğuna bakalım

// 1
@dynamicMemberLookup
class Person {
  let name: String
  let age: Int
  private let details: [String: String]

  init(name: String, age: Int, details: [String: String]) {
    self.name = name
    self.age = age
    self.details = details
  }

  // 2
  subscript(dynamicMember key: String) -> String {
    switch key {
      case "info":
        return "\(name) is \(age) years old."
      default:
        return details[key] ?? ""
    }
  }
}

// 3
me.info   // "Cosmin is 32 years old." 
me.title  // "Author"

// 1

Sınıfı tanımlarken @dynamicMemberLookup kullanıyoruz, böylece o sınıf için “dot syntax”ı aktifleştirmiş oluyoruz.

// 2

subscript metodunu tanımlarken parametrenin başına dynamicMember yazıyoruz.

// 3

artık sadece tanımladığımız sınıfın sonuna . (nokta) koyarak property kullanır gibi subscript içeriklerine erişebiliriz.