
静的型システムを備えたすべての言語がSwiftほど強力であるとは限りません。これは、ファントム型、ジェネリック型拡張、および関連する型の列挙などのSwift機能によって可能になります。今週は、ファントムタイプを使用してタイプセーフなAPIを作成する方法を学習します。
基礎
— , , , . 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".
-