From 8f3e97a9b8f7f8091157786a256c6dc297493323 Mon Sep 17 00:00:00 2001 From: Sal0g <> Date: Sat, 1 Dec 2018 12:08:45 +0100 Subject: [PATCH 1/5] 1571 - Improved objc compatibility Improved Objective C compatibility when using **objcCompatible** - Use **class** instead of **struct** - Add **@objc** and **NSObject** for classes in API and model classes --- .../src/main/resources/swift4/api.mustache | 4 ++-- .../src/main/resources/swift4/modelObject.mustache | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/swift4/api.mustache b/modules/openapi-generator/src/main/resources/swift4/api.mustache index ed4afe13a0ff..7f2ff1ea1f0f 100644 --- a/modules/openapi-generator/src/main/resources/swift4/api.mustache +++ b/modules/openapi-generator/src/main/resources/swift4/api.mustache @@ -16,7 +16,7 @@ extension {{projectName}}API { {{#description}} /** {{description}} */{{/description}} -open class {{classname}} { +{{#objcCompatible}}@objc {{/objcCompatible}}open class {{classname}}{{#objcCompatible}} : NSObject{{/objcCompatible}} { {{#operation}} {{#allParams}} {{#isEnum}} @@ -40,7 +40,7 @@ open class {{classname}} { - parameter {{paramName}}: ({{#isFormParam}}form{{/isFormParam}}{{#isQueryParam}}query{{/isQueryParam}}{{#isPathParam}}path{{/isPathParam}}{{#isHeaderParam}}header{{/isHeaderParam}}{{#isBodyParam}}body{{/isBodyParam}}) {{description}} {{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}{{/allParams}} - parameter completion: completion handler to receive the data and the error objects */ - open class func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}completion: @escaping ((_ data: {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}?,_ error: Error?) -> Void)) { + {{#objcCompatible}}@objc {{/objcCompatible}}open class func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}completion: @escaping ((_ data: {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}?,_ error: Error?) -> Void)) { {{operationId}}WithRequestBuilder({{#allParams}}{{paramName}}: {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}).execute { (response, error) -> Void in {{#returnType}} completion(response?.body, error) diff --git a/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache b/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache index d477ac7880d6..7874ef78e51b 100644 --- a/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache +++ b/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache @@ -1,5 +1,5 @@ - -public struct {{classname}}: Codable { +{{#objcCompatible}}@objc public class {{classname}}: NSObject, Codable { {{/objcCompatible}} +{{^objcCompatible}}public struct {{classname}}: Codable { {{/objcCompatible}} {{#allVars}} {{#isEnum}} @@ -9,12 +9,12 @@ public struct {{classname}}: Codable { {{#allVars}} {{#isEnum}} {{#description}}/** {{description}} */ - {{/description}}public var {{name}}: {{{datatypeWithEnum}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}} + {{/description}}{{#objcCompatible}}@objc {{/objcCompatible}}public var {{name}}: {{{datatypeWithEnum}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}} {{/isEnum}} {{^isEnum}} {{#description}}/** {{description}} */ - {{/description}}public var {{name}}: {{{datatype}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#objcCompatible}}{{#vendorExtensions.x-swift-optional-scalar}} - public var {{name}}Num: NSNumber? { + {{/description}}{{#objcCompatible}}@objc {{/objcCompatible}}public var {{name}}: {{{datatype}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#objcCompatible}}{{#vendorExtensions.x-swift-optional-scalar}} + {{#objcCompatible}}@objc {{/objcCompatible}}public var {{name}}Num: NSNumber? { get { return {{name}}.map({ return NSNumber(value: $0) }) } @@ -23,7 +23,7 @@ public struct {{classname}}: Codable { {{/allVars}} {{#hasVars}} - public init({{#allVars}}{{name}}: {{{datatypeWithEnum}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#hasMore}}, {{/hasMore}}{{/allVars}}) { + {{#objcCompatible}}@objc {{/objcCompatible}}public init({{#allVars}}{{name}}: {{{datatypeWithEnum}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#hasMore}}, {{/hasMore}}{{/allVars}}) { {{#allVars}} self.{{name}} = {{name}} {{/allVars}} From 6628a2af4bf61ba537b7ee3486ad7bb634fcab62 Mon Sep 17 00:00:00 2001 From: Sal0g <> Date: Sun, 2 Dec 2018 21:18:30 +0100 Subject: [PATCH 2/5] Minor edit --- .../src/main/resources/swift4/modelObject.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache b/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache index 7874ef78e51b..49097c1e42ce 100644 --- a/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache +++ b/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache @@ -14,7 +14,7 @@ {{^isEnum}} {{#description}}/** {{description}} */ {{/description}}{{#objcCompatible}}@objc {{/objcCompatible}}public var {{name}}: {{{datatype}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#objcCompatible}}{{#vendorExtensions.x-swift-optional-scalar}} - {{#objcCompatible}}@objc {{/objcCompatible}}public var {{name}}Num: NSNumber? { + @objc public var {{name}}Num: NSNumber? { get { return {{name}}.map({ return NSNumber(value: $0) }) } From 741e43f167f50d59f732870b8cb1704c7b10fb09 Mon Sep 17 00:00:00 2001 From: Gunther Cronenberg Date: Wed, 5 Dec 2018 15:48:02 +0100 Subject: [PATCH 3/5] Further improved objc compatibility - Models: Expose non-optional variables to @objc. Otherwise e.g. Int64 is not visible in objc - Models: Try avoiding generated code that has boolVariable.map ({ return NSNumber(value: $0) }) as map does not exist for Bool in Swift (see Issue #1456) - API: Avoid Void? arguments with @objc, as they are not available in objc --- .../src/main/resources/swift4/api.mustache | 8 +++++--- .../src/main/resources/swift4/modelObject.mustache | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/swift4/api.mustache b/modules/openapi-generator/src/main/resources/swift4/api.mustache index 7f2ff1ea1f0f..0be05127453d 100644 --- a/modules/openapi-generator/src/main/resources/swift4/api.mustache +++ b/modules/openapi-generator/src/main/resources/swift4/api.mustache @@ -40,18 +40,20 @@ extension {{projectName}}API { - parameter {{paramName}}: ({{#isFormParam}}form{{/isFormParam}}{{#isQueryParam}}query{{/isQueryParam}}{{#isPathParam}}path{{/isPathParam}}{{#isHeaderParam}}header{{/isHeaderParam}}{{#isBodyParam}}body{{/isBodyParam}}) {{description}} {{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}{{/allParams}} - parameter completion: completion handler to receive the data and the error objects */ - {{#objcCompatible}}@objc {{/objcCompatible}}open class func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}completion: @escaping ((_ data: {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}?,_ error: Error?) -> Void)) { + {{#objcCompatible}}@objc {{/objcCompatible}}open class func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}completion: @escaping (({{#returnType}}_ data: {{{returnType}}}?,{{/returnType}}{{^returnType}}{{^objcCompatible}}_ data: Void?,{{/objcCompatible}}{{/returnType}}_ error: Error?) -> Void)) { {{operationId}}WithRequestBuilder({{#allParams}}{{paramName}}: {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}).execute { (response, error) -> Void in {{#returnType}} completion(response?.body, error) {{/returnType}} - {{^returnType}} + {{^returnType}}{{#objcCompatible}} + completion(error) + {{/objcCompatible}}{{^objcCompatible}} if error == nil { completion((), error) } else { completion(nil, error) } - {{/returnType}} + {{/objcCompatible}}{{/returnType}} } } diff --git a/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache b/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache index 49097c1e42ce..84cb7cb3d333 100644 --- a/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache +++ b/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache @@ -13,17 +13,17 @@ {{/isEnum}} {{^isEnum}} {{#description}}/** {{description}} */ - {{/description}}{{#objcCompatible}}@objc {{/objcCompatible}}public var {{name}}: {{{datatype}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#objcCompatible}}{{#vendorExtensions.x-swift-optional-scalar}} + {{/description}}{{#objcCompatible}}{{#required}}@objc {{/required}}{{^required}}{{^vendorExtensions.x-swift-optional-scalar}}@objc {{/vendorExtensions.x-swift-optional-scalar}}{{/required}}{{/objcCompatible}}public var {{name}}: {{{datatype}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#objcCompatible}}{{#vendorExtensions.x-swift-optional-scalar}} @objc public var {{name}}Num: NSNumber? { get { - return {{name}}.map({ return NSNumber(value: $0) }) + return {{name}} as NSNumber? } }{{/vendorExtensions.x-swift-optional-scalar}}{{/objcCompatible}} {{/isEnum}} {{/allVars}} {{#hasVars}} - {{#objcCompatible}}@objc {{/objcCompatible}}public init({{#allVars}}{{name}}: {{{datatypeWithEnum}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#hasMore}}, {{/hasMore}}{{/allVars}}) { + public init({{#allVars}}{{name}}: {{{datatypeWithEnum}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#hasMore}}, {{/hasMore}}{{/allVars}}) { {{#allVars}} self.{{name}} = {{name}} {{/allVars}} From cae878bdeefe0a322be0a0ff3de39a6dd59e38d7 Mon Sep 17 00:00:00 2001 From: Sal0g <> Date: Fri, 14 Dec 2018 12:21:01 +0100 Subject: [PATCH 4/5] Avoid empty lines Cosmetic changes to avoid trailing/leading spaces or empty lines. --- .../src/main/resources/swift4/api.mustache | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/swift4/api.mustache b/modules/openapi-generator/src/main/resources/swift4/api.mustache index 0be05127453d..6e9b01c3cad6 100644 --- a/modules/openapi-generator/src/main/resources/swift4/api.mustache +++ b/modules/openapi-generator/src/main/resources/swift4/api.mustache @@ -45,15 +45,18 @@ extension {{projectName}}API { {{#returnType}} completion(response?.body, error) {{/returnType}} - {{^returnType}}{{#objcCompatible}} + {{^returnType}} + {{#objcCompatible}} completion(error) - {{/objcCompatible}}{{^objcCompatible}} + {{/objcCompatible}} + {{^objcCompatible}} if error == nil { completion((), error) } else { completion(nil, error) } - {{/objcCompatible}}{{/returnType}} + {{/objcCompatible}} + {{/returnType}} } } From b967380bd2bd0900439942d89578e61f9c3b05aa Mon Sep 17 00:00:00 2001 From: Sal0g <> Date: Fri, 14 Dec 2018 12:29:00 +0100 Subject: [PATCH 5/5] Space missing --- .../src/main/resources/swift4/modelObject.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache b/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache index 84cb7cb3d333..8e7afc4977d0 100644 --- a/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache +++ b/modules/openapi-generator/src/main/resources/swift4/modelObject.mustache @@ -23,7 +23,7 @@ {{/allVars}} {{#hasVars}} - public init({{#allVars}}{{name}}: {{{datatypeWithEnum}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#hasMore}}, {{/hasMore}}{{/allVars}}) { + public init({{#allVars}}{{name}}: {{{datatypeWithEnum}}}{{#unwrapRequired}}?{{/unwrapRequired}}{{^unwrapRequired}}{{^required}}?{{/required}}{{/unwrapRequired}}{{#hasMore}}, {{/hasMore}}{{/allVars}}) { {{#allVars}} self.{{name}} = {{name}} {{/allVars}}