NativeScript-JavaScriptを使用したネイティブAPI
このセクションでは、JavaScriptを使用したネイティブAPIへのアクセスの概要について説明します。
マーシャリング
NativeScriptランタイムは、AndroidプラットフォームとiOSプラットフォームの両方に暗黙的な型変換を提供します。この概念はマーシャリングとして知られています。たとえば、NativeScript-iOS paltformは、JavaScriptとObjective-Cのデータ型を同様に暗黙的に変換でき、Java / KotlinはJavaScriptプロジェクトの型と値に簡単にマッピングできます。各タイプのマーシャリングを1つずつ簡単に実行する方法を理解しましょう。
数値
iOSとAndroidの数値データ型をJavaScriptの数値に簡単に変換できます。iOSからJavaScriptへの単純な数値変換を以下に定義します-
console.log(`max(7,9) = ${max(7,9)}`);
ここに、
ネイティブのmax()関数はJavaScript番号に変換されます。
Android環境
Javaは、byte、short、int、float、double、longなどのさまざまな数値タイプをサポートしています。JavaScriptには数値型しかありません。
以下に示す単純なJavaクラスについて考えてみます。
class Demo extends java.lang.Object {
public int maxMethod(int a,int b) {
if(a>b) {
return a;
} else {
return b;
}
}
}
ここに、
上記のコードには、2つの整数引数が含まれています。以下に示すように、JavaScriptを使用して上記のコードオブジェクトを呼び出すことができます-
//Create an instance for Demo class
var obj = new Demo();
//implicit integer conversion for calling the above method
obj.maxMethod(7,9);
文字列
Androidの文字列はjava.lang.stringで定義され、iOSの文字列はNSSringで定義されます。両方のプラットフォームでマーシャリングを実行する方法を見てみましょう。
アンドロイド
文字列は不変ですが、文字列バッファは可変文字列をサポートしています。
以下のコードは、単純なマッピングの例です-
//Create android label widget
var label = new android.widget.Label();
//Create JavaScript string
var str = "Label1";
//Convert JavaScript string into java label.setText(str);
// text is converted to java.lang.String
ブールクラスはjava.lang.Booleanで定義されています。このクラスは、ブール値をオブジェクトにラップします。ブール値を文字列に、またはその逆に簡単に変換できます。簡単な例は次のように定義されています-
//create java string
let data = new java.lang.String('NativeScript');
//map java String to JavaScript string,
let result = data.startsWith('N');
//return result
console.log(result);// true
iOS環境
NSStringクラスは不変ですが、そのサブクラスNSMutableStringは不変です。このクラスには、文字列を操作するためのメソッドのコレクションが含まれています。以下のように宣言されています-
class NSString : NSObject
以下に示すような単純なobjective-c宣言について考えてみます。
NSString *str = @"nativescript";
//convert the string to uppercase
NSString *str1;
str1 = [str uppercaseString];
NSLog(@"Uppercase String : %@\n", str1 );
NSStringsはJavaScript文字列に簡単にマッピングできます。
アレイ
このセクションでは、配列でマーシャリングを実行する方法について説明します。まず、iOS環境の例を見てみましょう。
配列宣言
class NSArray : NSObject
ここに、
NSArrayは、配列と呼ばれるオブジェクトの順序付けられたコレクションを管理するために使用されます。静的配列を作成するために使用されます。そのサブクラスNSMutableArray 動的配列を作成するために使用されます。
NSArrayオブジェクトは、以下に示すように配列リテラルを使用して作成できると考えてください。
let array: NSArray = ["React","Vue","TypeScript"]
これで、以下に示すように、この配列をJavaScriptにマップできます。
//create native array
let nsArr = NSArray.arrayWithArray("React","Vue","TypeScript"]);
//create simple javascript array
let jsArr = ["Hello,World","NativeScript"];
//Now compare the two arrays,
let compare = nsArr.isEqual(jsArr);
console.log(comapre);
これにより、出力がfalseとして返されます。
Android配列宣言
Java配列はで定義されています java.util.Arrays。このクラスには、配列を操作するためのさまざまなメソッドが含まれています。例を以下に示します-
//javascript array
let data = [12,45,23,56,34,78,50];
//create java array
let result = ns.example.Math.maxElement(data);
console.log(result);
クラスとオブジェクト
クラスとオブジェクトは、オブジェクト指向プログラミングの基本的な概念です。クラスはユーザー定義のプロトタイプです。オブジェクトはクラスのインスタンスです。クラスは、1つのタイプのすべてのオブジェクトに共通するプロパティまたはメソッドのセットを表します。両方のモバイル開発環境のネイティブクラスとオブジェクトを理解しましょう。
Android環境
JavaクラスとKotlinクラスには、完全なパッケージ名で示される一意の識別子があります。
例えば、
android.view.View−これは、画面レイアウトとユーザーとの対話のための基本的なユーザーインターフェイスクラスです。以下に示すように、JavaScriptでこのクラスにアクセスできます-
const View = android.view.View;
まず、以下のステートメントを使用してクラスをインポートします-
import android.view.View;
次に、以下のようにクラスを作成します-
public class MyClass {
public static void staticMethod(context) {
//create view instance
android.view.View myview = new android.view.View(context);
}
}
上記の同じクラスで、以下のコードを使用してJavaScript関数にアクセスできます-
const myview = new android.view.View(context);
同様に、java.langパッケージ内のインターフェース、定数、および列挙にアクセスできます。
iOS環境
Objective-Cクラスは、@ interfaceと@implementationの2つのセクションで定義されています。クラス定義はキーワードで始まります@interface 続いて interface(class)名前。Objective-Cでは、すべてのクラスはNSObjectと呼ばれる基本クラスから派生しています。
これは、すべてのObjective-Cクラスのスーパークラスです。Simple Circleクラスは、次のように定義されます。
@interface Circle:NSObject {
//Instance variable
int radius;
}
@end
以下に示すように、1つのメソッドを持つクラスを考えてみましょう-
@interface MyClass : NSObject
+ (void)baseStaticMethod;
@end
このクラスは、以下のコードを使用してjavascriptに変換できます-
function MyClass() { /* native call */ };
Object.setPrototypeOf(MyClass, NSObject);
BaseClass.baseStaticMethod = function () { /* native call */ };
JavaScript instanceof演算子は、オブジェクトが特定のクラスから継承されているかどうかを確認するために使用されます。これは次のように定義できます-
var obj = MyClass.alloc().init(); // object creation
console.log(obj instanceof NSObject); //return true
ここに、
Objective-Cインスタンスは、alloc、init、またはnewメソッドを使用して作成されます。上記の例では、以下のように新しいメソッドを使用してオブジェクトの初期化を簡単に作成できます。
var obj = MyClass.new();
同様に、静的メソッドとプロパティにアクセスできます。