DAY 3
3
Mobile Development

## 型態

Dart擁有intdoubleStringbool等常見的變數型態

``````void main() {
var a = 1; //int 整數
var b = "1"; // String 字串
var c = 1.1; // double 浮點數

if (a is int) {
print('a is int'); // Output： a is int
}
if (b is String) {
print('b is String'); // Output： b is String
}
if (c is double) {
print('c is double'); // Output： c is double
}
}
``````

``````void main() {
var a = 1;
a = "123"; // Error: A value of type 'String' can't be assigned to a variable of type 'int'.
}
``````

``````void main() {
dynamic a = 1;
a = '123';  // no error

}
``````

``````void main() {
var a;
a = 1;
print(a); // Output：1
a = "123";
print(a); // Output： 123
}
``````

Dart還有List可以使用，定義list需要使用方括號`[]`，同樣的你可以在宣告的時候定義儲存值的型態，或是用dynamic來接受所有的型態。

``````void main() {
List<dynamic> a = const [1, '123', true];
print(a[1]); // Output：123
}
``````

``````void main() {
var map = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3'
};

print(map['key1']);    // Output: value1
print(map['test']);    // Output: null

map['key4'] = 'value4';

//Length
print(map.length); //Output： 4

print(map.containsKey('value1')); // Output： false

print(map.entries); // Output： (MapEntry(key1: value1), MapEntry(key2: value2), MapEntry(key3: value3), MapEntry(key4: value4))
print(map.values); // Output： (value1, value2, value3, value4)
}
``````

## Function

function是很重要的東西，它能夠讓你的code能夠重複使用(code reuse)，方便你移植維護專案。

``````void main() {
print(birthday('John', 11, 22));
// Output： John's birthday is 11/22.
}
String birthday(String name, int month, int day) {
// 若想在字串內插入變數可以使用\${var}或是\$var喔
return "\${name}'s birthday is \$month/\$day.";
}
``````

birthday前的`String`表示了這個function回傳的型態
`(String name, int month, int day)`定義它需要的參數
`return "\${name}'s birthday is \$month/\$day."`則是回傳的結果

``````// Dart裡可以省略回傳的型態，Dart會根據回傳值自動判定
// (但並不建議這樣寫，會不易維護程式碼)

birthday(String name, int month, int day) {
return "\${name}'s birthday is \$month/\$day.";
}
``````
``````// 假如你的function只有一行，就可以使用「=>」來簡化
// => expr是{return expr;}的縮寫

String birthday(String name, int month, int day) =>
"\${name}'s birthday is \$month/\$day.";

``````

function也可以使用命名參數(Named parameters)，來看個例子。

``````void main() {
print(birthday(name:'John', day:22, ));
// Output： John's birthday is null/22.

}
birthday({String name='Amy', int month, int day}) =>
"\${name}'s birthday is \$month/\$day.";
``````

name、month、day是Key
John、11、22則是對應的Value

``````void main() {
var nums = [1, 2, 3, 4, 5];
iterNums(nums);
}

void iterNums(List nums) {
nums.forEach((num)=>print("Number is \$num"));
}
``````

`forEach`是list的method，會迭代list內的每個元素並把它作為參數傳進匿名函式中。
`(num)=>print("Number is \$num")`就是匿名函式，可以發現它並沒有名字只由`()`所組成，而裡面的`num`則是會被帶進這個函式裡使用的參數。