FHIR Swift 类

这些是 Swift 类,代表 🔥 FHIR 元素和资源的数据模型,与 iOS 11OS X 10.13 及更高版本兼容。

此项目基于 Apache 许可证。FHIR® 是 HL7 的注册商标,已获得 HL7 的许可使用。

版本控制

由于结合两种快速变化的技术的复杂性,这里概述了哪个版本号使用哪个 SwiftFHIR 版本

请参阅 tags/releases

版本 Swift FHIR  
4.2 5.0 包 4.0.0-a53ec6ee1b R4
4.1 5.0 4.0.0-a53ec6ee1b R4
4.0 4.2 4.0.0-a53ec6ee1b R4
3.1 3.2 3.0.0.11832 STU 3
3.0 3.0 3.0.0.11832 STU 3
2.10 3.0 1.8.0.10521 STU 3 冻结版,2017 年 1 月
2.9 3.0 1.6.0.9663 STU 3 投票版,2016 年 9 月
2.8 3.0 1.0.2.7202 DSTU 2 (+ 技术勘误)
2.4 2.2 1.6.0.9663 STU 3 投票版,2016 年 9 月
2.3 2.3 1.0.2.7202 DSTU 2 (+ 技术勘误)
2.2.3 2.2 1.0.2.7202 DSTU 2 (+ 技术勘误)
2.2 2.0-2.2 1.0.2.7202 DSTU 2 (+ 技术勘误)
2.1 2.0-2.2 1.0.1.7108 DSTU 2
2.0 2.0-2.2 0.5.0.5149 DSTU 2 投票版,2015 年 5 月
1.0 1.2 0.5.0.5149 DSTU 2 投票版,2015 年 5 月
0.2 1.1 0.5.0.5149 DSTU 2 投票版,2015 年 5 月
0.1 1.0 0.0.81.2382 DSTU 1

SMART on FHIR

Swift-SMART 框架使用这些类。

进展

以下是尚待完成事项的粗略列表。

[ ] Remove _isSummaryResource workaround to STU-3's nMin/isSummary errors
[ ] More convenience methods to working with resources in code
[ ] Nice support for simple PATCH operations
[ ] Separate resource models from base models; needs untangling of
    _owningResource, _owningBundle (easy), _resolved etc.
[ ] Handle resource versions nicely
[ ] Create a default behavior when a modifierExtension is detected
[ ] Update/modernize FHIRSearch
[ ] Search: report search parameters that the server ignored

至少在某种程度上可以工作

命名约定

应用标准的 Swift 命名约定。制表符用于缩进,空格用于对齐——集两者之长。代表 FHIR 资源的类没有前缀。自定义类和协议以 FHIR 开头,以避免与元素或资源类冲突,并使其易于区分。

FHIR 数据模型

类是使用我们的 Python FHIR 解析器从 FHIR 资源定义生成的。

冗长性

Swift 是 静态类型语言,且此时的内省非常有限。因此,生成器需要更冗长,并创建类级别的序列化器/反序列化器,而不是在运行时查看类属性并弄清楚如何序列化/反序列化。

基数

一些数据模型具有基数至少为 1 的属性。虽然可以通过将它们设为可选类型来强制它们在 Swift 中永远不为 nil,但它们仍然是可选的,以便启用仅接受 JSON 字典的统一初始化器。对于代表具有非可选属性的模型的类,提供了一个便捷的初始化器,以反映设置这些属性的需求,而无需强制执行。

包含资源

FHIR 使用 包含资源Reference 类中包含一个扩展,该扩展添加了处理引用解析的方法。

要解析资源引用,请对引用属性调用 resolve(ModelClass) { resource in },如果解析成功,回调将返回引用类型的实例。要包含资源并接收 Reference 实例,请调用 parent.containResource(contained)

// create a prescription with a contained medication
let order = MedicationRequest()
let medication = Medication()
medication.id = "med"
do {
    order.medicationReference = try order.containResource(medication)
}
catch let error {
    // failed to contain, either because no id or containing itself
}

// resolve the contained medication
order.medication?.resolve(Medication.self) { medication in
	if let medication = medication {
		// successfully resolved
	}
}

搜索

客户端支持 fhir.js 提出和使用的类似 NoSQL 的方法。

隔离舱室

搜索可以限制在 隔离舱室中,但这些在 SMART 服务器和这些类中尚不受支持。

[ ] Patient/23/procedure?date=>2010-01-01&date=<2011-12-31

引用(尚未实现)

如果搜索限制为引用属性,则适用以下情况

打包

框架的完整构建将包含所有 FHIR 资源,这将导致一个相当大的二进制文件。请查看 package.py 脚本:从命令行调用脚本时提供一个或多个资源名称,它将输出所需资源的所有元素和资源。然后,您或许可以删除不必要的资源,但这不幸的是一项繁琐的任务,需要摆弄工厂。

有一个实验性的 SwiftFHIRMin-iOS 构建目标,它仅包含最少的一组资源。这里的问题是工厂被排除在外,因此反引用、捆绑包和包含的资源将无法正确实例化。