diff --git a/head/schema-swift/test/inputs/schema/date-time.schema/support-linux-false--4bd8c552e09a/quicktype.swift b/head/schema-swift/test/inputs/schema/date-time.schema/support-linux-false--4bd8c552e09a/quicktype.swift
new file mode 100644
index 0000000..5590f51
--- /dev/null
+++ b/head/schema-swift/test/inputs/schema/date-time.schema/support-linux-false--4bd8c552e09a/quicktype.swift
@@ -0,0 +1,138 @@
+// This file was generated from JSON Schema using quicktype, do not modify it directly.
+// To parse the JSON, add this file to your project and do:
+//
+//   let topLevel = try TopLevel(json)
+
+import Foundation
+
+// MARK: - TopLevel
+struct TopLevel: Codable {
+    let complexUnionArray: [ComplexUnionArrayElement]
+    let date: String
+    let dateTime: Date
+    let time: String
+    let unionArray: [String]
+
+    enum CodingKeys: String, CodingKey {
+        case complexUnionArray = "complex-union-array"
+        case date = "date"
+        case dateTime = "date-time"
+        case time = "time"
+        case unionArray = "union-array"
+    }
+}
+
+// MARK: TopLevel convenience initializers and mutators
+
+extension TopLevel {
+    init(data: Data) throws {
+        self = try newJSONDecoder().decode(TopLevel.self, from: data)
+    }
+
+    init(_ json: String, using encoding: String.Encoding = .utf8) throws {
+        guard let data = json.data(using: encoding) else {
+            throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
+        }
+        try self.init(data: data)
+    }
+
+    init(fromURL url: URL) throws {
+        try self.init(data: try Data(contentsOf: url))
+    }
+
+    func with(
+        complexUnionArray: [ComplexUnionArrayElement]? = nil,
+        date: String? = nil,
+        dateTime: Date? = nil,
+        time: String? = nil,
+        unionArray: [String]? = nil
+    ) -> TopLevel {
+        return TopLevel(
+            complexUnionArray: complexUnionArray ?? self.complexUnionArray,
+            date: date ?? self.date,
+            dateTime: dateTime ?? self.dateTime,
+            time: time ?? self.time,
+            unionArray: unionArray ?? self.unionArray
+        )
+    }
+
+    func jsonData() throws -> Data {
+        return try newJSONEncoder().encode(self)
+    }
+
+    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
+        return String(data: try self.jsonData(), encoding: encoding)
+    }
+}
+
+enum ComplexUnionArrayElement: Codable {
+    case dateTime(Date)
+    case enumeration(ComplexUnionArrayEnum)
+    case integer(Int)
+
+    init(from decoder: Decoder) throws {
+        let container = try decoder.singleValueContainer()
+        if let x = try? container.decode(Int.self) {
+            self = .integer(x)
+            return
+        }
+        if let x = try? container.decode(Date.self) {
+            self = .dateTime(x)
+            return
+        }
+        if let x = try? container.decode(ComplexUnionArrayEnum.self) {
+            self = .enumeration(x)
+            return
+        }
+        throw DecodingError.typeMismatch(ComplexUnionArrayElement.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for ComplexUnionArrayElement"))
+    }
+
+    func encode(to encoder: Encoder) throws {
+        var container = encoder.singleValueContainer()
+        switch self {
+        case .dateTime(let x):
+            try container.encode(x)
+        case .enumeration(let x):
+            try container.encode(x)
+        case .integer(let x):
+            try container.encode(x)
+        }
+    }
+}
+
+enum ComplexUnionArrayEnum: String, Codable {
+    case foo = "foo"
+    case bar = "bar"
+}
+
+// MARK: - Helper functions for creating encoders and decoders
+
+func newJSONDecoder() -> JSONDecoder {
+    let decoder = JSONDecoder()
+    if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
+        decoder.dateDecodingStrategy = .custom { decoder in
+            let dateStr = try decoder.singleValueContainer().decode(String.self).uppercased()
+            let dateData = try JSONEncoder().encode(dateStr)
+            let dateDecoder = JSONDecoder()
+            dateDecoder.dateDecodingStrategy = .iso8601
+            return try dateDecoder.decode(Date.self, from: dateData)
+        }
+    }
+    return decoder
+}
+
+func newJSONEncoder() -> JSONEncoder {
+    let encoder = JSONEncoder()
+    if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
+        encoder.dateEncodingStrategy = .custom { date, encoder in
+            let formatter = ISO8601DateFormatter()
+            if #available(iOS 11.0, OSX 10.13, tvOS 11.0, watchOS 4.0, *),
+                date.timeIntervalSince1970.truncatingRemainder(dividingBy: 1) != 0 {
+                formatter.formatOptions.insert(.withFractionalSeconds)
+            }
+            var container = encoder.singleValueContainer()
+            try container.encode(formatter.string(from: date))
+        }
+    }
+    return encoder
+}
diff --git a/base/swift/test/inputs/json/priority/combinations1.json/support-linux-false--4bd8c552e09a/quicktype.swift b/head/swift/test/inputs/json/priority/combinations1.json/support-linux-false--4bd8c552e09a/quicktype.swift
index 8b870f8..a766c19 100644
--- a/base/swift/test/inputs/json/priority/combinations1.json/support-linux-false--4bd8c552e09a/quicktype.swift
+++ b/head/swift/test/inputs/json/priority/combinations1.json/support-linux-false--4bd8c552e09a/quicktype.swift
@@ -2793,7 +2793,15 @@ func newJSONDecoder() -> JSONDecoder {
 func newJSONEncoder() -> JSONEncoder {
     let encoder = JSONEncoder()
     if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
-        encoder.dateEncodingStrategy = .iso8601
+        encoder.dateEncodingStrategy = .custom { date, encoder in
+            let formatter = ISO8601DateFormatter()
+            if #available(iOS 11.0, OSX 10.13, tvOS 11.0, watchOS 4.0, *),
+                date.timeIntervalSince1970.truncatingRemainder(dividingBy: 1) != 0 {
+                formatter.formatOptions.insert(.withFractionalSeconds)
+            }
+            var container = encoder.singleValueContainer()
+            try container.encode(formatter.string(from: date))
+        }
     }
     return encoder
 }
diff --git a/base/swift/test/inputs/json/priority/combinations2.json/support-linux-false--4bd8c552e09a/quicktype.swift b/head/swift/test/inputs/json/priority/combinations2.json/support-linux-false--4bd8c552e09a/quicktype.swift
index 8237493..b8a3926 100644
--- a/base/swift/test/inputs/json/priority/combinations2.json/support-linux-false--4bd8c552e09a/quicktype.swift
+++ b/head/swift/test/inputs/json/priority/combinations2.json/support-linux-false--4bd8c552e09a/quicktype.swift
@@ -2557,7 +2557,15 @@ func newJSONDecoder() -> JSONDecoder {
 func newJSONEncoder() -> JSONEncoder {
     let encoder = JSONEncoder()
     if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
-        encoder.dateEncodingStrategy = .iso8601
+        encoder.dateEncodingStrategy = .custom { date, encoder in
+            let formatter = ISO8601DateFormatter()
+            if #available(iOS 11.0, OSX 10.13, tvOS 11.0, watchOS 4.0, *),
+                date.timeIntervalSince1970.truncatingRemainder(dividingBy: 1) != 0 {
+                formatter.formatOptions.insert(.withFractionalSeconds)
+            }
+            var container = encoder.singleValueContainer()
+            try container.encode(formatter.string(from: date))
+        }
     }
     return encoder
 }
diff --git a/base/swift/test/inputs/json/priority/combinations3.json/support-linux-false--4bd8c552e09a/quicktype.swift b/head/swift/test/inputs/json/priority/combinations3.json/support-linux-false--4bd8c552e09a/quicktype.swift
index a7f87b2..742d8bc 100644
--- a/base/swift/test/inputs/json/priority/combinations3.json/support-linux-false--4bd8c552e09a/quicktype.swift
+++ b/head/swift/test/inputs/json/priority/combinations3.json/support-linux-false--4bd8c552e09a/quicktype.swift
@@ -3092,7 +3092,15 @@ func newJSONDecoder() -> JSONDecoder {
 func newJSONEncoder() -> JSONEncoder {
     let encoder = JSONEncoder()
     if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
-        encoder.dateEncodingStrategy = .iso8601
+        encoder.dateEncodingStrategy = .custom { date, encoder in
+            let formatter = ISO8601DateFormatter()
+            if #available(iOS 11.0, OSX 10.13, tvOS 11.0, watchOS 4.0, *),
+                date.timeIntervalSince1970.truncatingRemainder(dividingBy: 1) != 0 {
+                formatter.formatOptions.insert(.withFractionalSeconds)
+            }
+            var container = encoder.singleValueContainer()
+            try container.encode(formatter.string(from: date))
+        }
     }
     return encoder
 }
diff --git a/base/swift/test/inputs/json/priority/combinations4.json/support-linux-false--4bd8c552e09a/quicktype.swift b/head/swift/test/inputs/json/priority/combinations4.json/support-linux-false--4bd8c552e09a/quicktype.swift
index 0340673..11c629c 100644
--- a/base/swift/test/inputs/json/priority/combinations4.json/support-linux-false--4bd8c552e09a/quicktype.swift
+++ b/head/swift/test/inputs/json/priority/combinations4.json/support-linux-false--4bd8c552e09a/quicktype.swift
@@ -3596,7 +3596,15 @@ func newJSONDecoder() -> JSONDecoder {
 func newJSONEncoder() -> JSONEncoder {
     let encoder = JSONEncoder()
     if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
-        encoder.dateEncodingStrategy = .iso8601
+        encoder.dateEncodingStrategy = .custom { date, encoder in
+            let formatter = ISO8601DateFormatter()
+            if #available(iOS 11.0, OSX 10.13, tvOS 11.0, watchOS 4.0, *),
+                date.timeIntervalSince1970.truncatingRemainder(dividingBy: 1) != 0 {
+                formatter.formatOptions.insert(.withFractionalSeconds)
+            }
+            var container = encoder.singleValueContainer()
+            try container.encode(formatter.string(from: date))
+        }
     }
     return encoder
 }
