Chapter 06

  変数の定義

heyhey1028
heyhey1028
2023.02.17に更新

変数定義

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 通信の返り値など「どのような値が返ってくるか分からない」場合以外は極力使用は避けましょう。

修飾子

修飾子は変数の型定義の前に付ける接頭辞です。既に上記の例で登場していますが、型の前に付いているfinalconstなどです。

実際には下記以外にも修飾子は存在しますが、最も使用頻度が高い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 での開発を通して、徐々に慣れていきましょう。

それでは次は関数とクラス定義について学んでいきましょう。