Toutes les langues avec un système de type statique ne sont pas aussi fortes que Swift. Ceci est rendu possible par les fonctionnalités Swift telles que les types fantômes, les extensions de type générique et les énumérations avec les types associés. Cette semaine, nous allons apprendre à utiliser des types fantômes pour créer des API de type sécurisé.
Les bases
— , , , . 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".