Tipos de fantasmas en Swift

No todos los idiomas con un sistema de tipos estáticos son tan fuertes como Swift. Esto es posible gracias a las características de Swift, como los tipos fantasmas, las extensiones de tipos genéricos y las enumeraciones con tipos asociados. Esta semana aprenderemos a usar tipos fantasmas para crear API seguras para tipos.





Los basicos

 — , , , . API. .





struct Identifier<Holder> {
    let value: Int
}
      
      



Identifier Holder. , Holder Identifier. . .





struct User {
    let id: Identifier<Self>
}

struct Product {
    let id: Identifier<Self>
}

let product = Product(id: .init(value: 1))
let user = User(id: .init(value: 1))

user.id == product.id
      
      



User () Product (), Identifier. 1 user product. , Swift :





«==» Identifier-User Identifier-Product.





, «» «». . Swift . , Swift .





func fetch(_ product: Identifier<Product>) -> Product? {
    // return product by id
}

fetch(user.id)
      
      



HealthKit

. . , HealthKit Apple Watch. , Apple Health.





import HealthKit

let store = HKHealthStore()
let bodyMass = HKQuantityType.quantityType(
    forIdentifier: HKQuantityTypeIdentifier.bodyMass
)!
let query = HKStatisticsQuery(
    quantityType: bodyMass,
    quantitySamplePredicate: nil,
    options: .discreteAverage
) { _, statistics, _ in
    let average = statistics?.averageQuantity()
    let mass = average?.doubleValue(for: .meter())
}

store.execute(query)
      
      



Apple Health. . , , . , API.





enum Distance {
    case mile
    case meter
}

enum Mass {
    case pound
    case gram
    case ounce
}

struct Statistics<Unit> {
    let value: Double
}


extension Statistics where Unit == Mass {
    func convert(to unit: Mass) -> Double {

    }
}

extension Statistics where Unit == Distance {
    func convert(to unit: Distance) -> Double {

    }
}

let weight = Statistics<Mass>(value: 75)
weight.convert(to: Distance.meter)
      
      



HealthKit, API . Mass () Distance (), . , Swift , :





Distance Mass.





, Swift. , . API . , . Twitter . !






"iOS Developer. Professional", - : "Machine Learning iOS CoreML CreateML".





-









All Articles