変数定義
Dart の変数定義は以下のルールに則ります。
-
修飾子
データ型
変数名
(=代入する値
);
// example
const int number = 150;
var String words;
words = myFunction();
前項でも述べた通り、データ型はオプショナルの為、書かなくてもエラーにはなりません。ただ最初のうちは静的型付けの恩恵を理解する為にも記述しておくと良いと思います。
データ型
Dart では以下のようなデータ型が扱われます。
type | content | example |
---|---|---|
String | 文字列 | 'cat' |
int | 整数値 | 12 |
double | 実数 | 12.0 |
bool | 真偽値 | false |
List | 配列 | List<String>[] |
Set | (重複のない)配列 | Set<int>{} |
Map | 連想配列 | Map<String,int>{} |
Function | 関数 | String Function(int) |
null | 何もない値 | null |
文字列の定義には基本'
(シングルクオート)を用いますが、"
(ダブルクオート)を用いる事も可能です。
final String name = 'John';
final String hello = "Hi, I'm John!";
final int age = 39;
final double height = 180.3;
final bool isMarried = true;
List
, Set
, Map
では格納するデータの型を<>
で囲って、定義します。
// String型を格納するList
const List<String> fruits = ['りんご','バナナ','みかん'];
// int型を格納するSet
final Set<int> countryCodes = {1,81,44,82,86,886};
// keyがString型、valueがint型のデータを格納するMap
final Map<String,int> students = {'佐藤':5, '伊藤':3};
関数は頭に返り値の型を、()
の中に引数の型を定義します。
// int型の引数を取り、String型の値を返す関数を格納
final String Function(int) myFunc = myFunction;
文字列に変数を埋め込む
文字列型に変数を埋め込みたい場合は下記のように$
もしくは${}
を付ける事で埋め込む事ができます。
変数のみを埋め込む場合は$
のみで埋め込み可能ですが、オブジェクトの値へのアクセスや関数の返り値など何かしらの処理の結果を埋め込みたい場合は${}
で囲うことで埋め込み可能です。
// 変数を埋め込む
final int age = 39;
final String message = "Hi, I'm $age years old";
print(message)
// output: Hi, I'm 39 years old
// アクセスしたオブジェクトの値を埋め込む
final Map<String,dynamic> info = {'name':'Blake', 'age':16};
final String greeting = "my name is ${info['name']}. I'm ${info['age']} years old.";
print(greeting);
// output: my name is Blake. I'm 16 years old.
// 関数の返り値を埋め込む
String sayMyFavoriteFruit(){
return 'peach';
}
final String introduction = 'I like ${sayMyFavoriteFruit()}.';
print(introduction);
// output: I like peach.
null
を許容する変数かどうか
null
とは値が存在しない状態の事を表すデータ型です。
変数によっては代入される値が定義したデータ型かもしくはnull
である場合があります。
そのような場合はデータ型の後ろに?
を記載することでnull
を許容する変数として定義することが出来ます。
final String? result = myFunction();
主なユースケースとしては後述する API 通信の返り値を受け取る変数やクラス内の変数などがあります。
dynamic を使った動的型付け
前項でも解説しましたが、dynamic
というキーワードを用いた変数を定義する事で、どのような型も格納できる変数を作る事が出来ます。
var dynamic anything;
anything = 'Baby';
anything = 2;
anything = 11.2;
anything = true;
anything = ['お絵かき','歌'];
anything = {'犬','猫','象'};
anything = {'ご飯':100, 'おやつ':50};
anything = myFunction;
しかしdynamic
はどのような値が入るか分からない分、意図しないエラーの元となります。その為、API 通信の返り値など「どのような値が返ってくるか分からない」場合以外は極力使用は避けましょう。
修飾子
修飾子は変数の型定義の前に付ける接頭辞です。既に上記の例で登場していますが、型の前に付いているfinal
やconst
などです。
実際には下記以外にも修飾子は存在しますが、最も使用頻度が高い3つを紹介します。
keyword | content |
---|---|
var | 変数 |
final | インスタンス生成時に代入される定数 |
const | コンパイル時に代入される定数 |
var
変数に対する修飾子です。何度でも代入し上書きする事が出来ます。
var int data = 0;
print(data);
data = 15;
print(data) // 何度上書きしてもOK
const
定数に対する修飾子です。コンパイル時に代入されるので、動的な値を代入する事は出来ません。例えばある関数の返り値の様なコンパイル後に計算された結果を代入する様な事は出来ません。
const int data = 20;
print(data); // output:20
data = 15; // 上書きはNG
const int number = myFunction(); // 動的な値はNG
final
定数に対する修飾子です。コンパイル時に代入される const
に対し、final
はインスタンス生成時に代入される為、動的な値なども柔軟に代入する事が出来ます。
final String data = 'John';
print(data) // output: John
data = 'Bob'; // 上書きはNG
final String name = myName(); // 動的な値もOK
まとめ
この章では文法の基礎となる変数定義について解説しました。Dart で用いられるデータ型や修飾子など色々な要素が関係してくる為、まだまだ理解が難しい部分もあるかと思いますが、この後に続く Flutter での開発を通して、徐々に慣れていきましょう。
それでは次は関数とクラス定義について学んでいきましょう。