Grid
init (_ items: [Item], viewForItem: @escaping (Item) -> ItemView) {
    self.items = items
    self.viewForItem = viewForItem
}
- 
@escapingis required because function is not used inside init but used somewhere else. 
extension Array where Element: Identifiable {
  func firstIndex(matching: Element) -> Int {
    for index in 0..<self.count {
      if self[index].id == matching.id {
        return index
      }
    }
    return 0
  }
}
- Adds new function to all Arrays where elements are identifiable
 - Name of the file 
Array+Identifiabletells that it's identifiable extension to Array 
Enum
enum FastFoodMenuItem {
  case hamburger(numberOfPatties: Int)
  case fries(size: FryOrderSize)
  case drink(String, ounces: Int)
  case cookie
}
enum FryOrderSize {
  case large
  case small
}
let menuItem: FastFoodMenuItem = FastFoodMenuItem.hamburger(patties: 2)
- Enums can contain extra data that's just for specific item like fries can be small or large.
 
Optional
enum Optional<T> {
  case none
  case some(T)
}
An optional is an enum.
var hello: String?              var hello: Optional<String> = .none
var hello: String? = "hello"    var hello: Optional<String> = .some("hello")
var hello: String? = nil        var hello: Optional<String> = .none
It's possible to get the value from optional two ways
hello! // this crashes the program in case the value is none
if let safehello = hello {
  print(safehello)
} else {
  // do something else
}
Default
hello ?? "This is default value"
- comma in 
ifstatement is like sequential&&operator meaning that the value that is assigned in first condition can be used in the second condition. 
var indexOfTheOneAndOnlyFaceUpCard: Int? {
  get {
    var faceUpCardIndices = [Int]()
    for index in cards.indices {
      if cards[index].isFaceUp {
        faceUpCardIndices.append(index)
      }
    }
    if faceUpCardIndices.count == 1 {
      return faceUpCardIndices.first
    } else {
      return nill
    }
  }
  set {
    for index in cards.indices {
      if index == newValue {
        cards[index].isFaceUp = true
      } else {
        cards[index].isFaceUp = false
      }
    }
  }
}
- When setting new value it turns all the other cards face down
 - when getting value it is going to check if there is two face up cards
 
    
Top comments (0)