GeneXus X Evolution 3 で使用するために作成した iOS 向け外部オブジェクト (およびユーザーコントロール) を GeneXus 15 で使用するには、変更を加える必要があります。
これは、GeneXus が提供する Flexible Client が、1 つの巨大なフレームワークから複数の小さなフレームワークに変わったためです。そのため、古いフレームワークにリンクされた以前の Xcode プロジェクトは、新しいバージョンでは機能しません。
GeneXus 15 には、すべての必要なフレームワームにリンク済みの、Xcode テンプレートが備わっています。そのため、新しい Xcode プロジェクトを開始することを強くお勧めします。
参考情報: iOS のユーザーコントロールまたは外部オブジェクト用のフレームワークテンプレート
既存のコードのほとんどは、少しの変更を加えるだけで機能します。
生成されるコードは Objective-C (Evolution 3) から Swift (バージョン 15) に変わりますが、引き続き、任意のプログラミング言語を使用してユーザーコントロールや外部オブジェクトを開発できます。既に Objective-C コードを記述している場合は、少しの変更を加えるだけで、GeneXus 15 でも使用できます。
Evolution 3 では、特定のヘッダーファイルを #import でインポートする必要がありました。例:
#import "GXExternalObjectBase.h"
現在は、必要なモジュールを @import でインポートします。Objective-C の場合は次のようになります。
@import GXStandardClasses;
Swift の場合は次のようになります。
import GXStandardClasses
注: 各クラスがどのモジュールにあるかを簡単に把握する方法はありません。一般的なルールとして、必要なクラスのほとんどが次のフレームワーク内にあります: GXStandardClasses、GXCoreUI、または GXCoreBL。
注: この説明は、外部オブジェクトがユーザーイベントから呼び出されたときではなく、生成されたコードから呼び出されたときにのみ当てはまります。
Objective-C ジェネレーターでは、数値タイプの項目属性と変数に NSNumber と NSDecimalNumber を使用しました。
Swift ジェネレーターでは Int(1)、Int64(2)、および Decimal(3) を使用するため、一部のメソッドの変換が必要になることがあります。
注: この説明は、外部オブジェクトがユーザーイベントから呼び出されたときではなく、生成されたコードから呼び出されたときにのみ当てはまります。
GeneXus X Evolution 3 Objective-C ジェネレーターでは、NSArray でパラメーターを受け取るのにメソッドが必要でした。
GeneXus 15 Swift ジェネレーターではこれが不要になりました。パラメーターは、コンマ区切りの名前ラベルなしで指定する必要があります。
たとえば、外部オブジェクトに Character 引数と Numeric 引数を使用する RepeatString メソッドがあり、2 番目のパラメーターで指定される回数分、文字列を繰り返すとします。
このメソッドを Objective-C で定義すると次のようになります。
- (NSString *)repeatString:(NSArray *)params;
Swift での定義は次のようになります。
func repeatString(_ str: String, _ num: Int) -> String
ヒント: 既に Objective-C 実装があり、それを Swift に移行したくない場合は、Swift に Objective-C メソッドと呼ばれるエクステンションを提供することで簡単に解決できます。その場合は、次のような内容の新しい "MyExternalObjectImplementation".swift ファイルを作成する必要があります。
public extension MyExternalObjectImplementation {
public class func repeatString(_ str: String, _ num: Int) -> String {
let params: Array<Any> = [ str, NSNumber(value: num) ]
return MyExternalObjectImplementation().repeatString(params)
}
}
GeneXus 15 以降では、パラメーター配列を受け取るメソッドは必要ありません。そのため、必要なパラメーターを定義したメソッドが既にある場合は、次のように、Swift エクステンションから実装を直接呼び出すことができます。
public extension MyExternalObjectImplementation {
public class func repeatString(_ str: String, _ num: Int) -> String {
return MyExternalObjectImplementation().repeatString(message:str, count: num)
}
}
これを機能させるには、"GeneXusInstallDir"\iOS\Templates\iOS_Genexus にある MainName-Bridging-Header.h ファイルを変更し、オブジェクトのインポートを追加してプロジェクトがコンパイルされるようにする必要があります。
#import "MyExternalObjectImplementation.h"
理由: GeneXus 15 は Swift を使用しますが、Objective-C 実装を呼び出しているためです。技術的な説明については、ここを参照してください。
(1) Int は、GeneXus で Numeric データタイプに使用されます (小数点なし、最大長 9)。
(2) Int64 は、GeneXus で Numeric データタイプに使用されます (小数点なし、長さ 9 以上)。
(3) Decimal は、GeneXus で Numeric データタイプに使用されます (少数点あり、長さは任意)。
GeneXus 15 以降
|