Skills/Flutter, Dart
[Dart] 3.0 업데이트 문법
개발자 윤구나
2024. 2. 5. 16:45
Dart 3.0 업데이트 문법 중 몇 가지만 정리해보았다.
1. Record
List를 좀 더 규격화해서 표현 할 수 있는 기능이다.
타입스크립트나 파이썬의 튜플과 같다고 보면 된다.
일반 괄호()를 이용해서 사용할 수 있다.
타입과 타입의 순서를 보장한다. name을 줄 수도 있다.
void main() {
final result = nameAndAge({
'name': '민지',
'age': 20,
});
print(result);
print(result.$1);
print(result.$2);
final result3 = getNewJeansWithType();
for(final item in result3) {
print(item.$1);
print(item.$2);
}
final result4 = getNewJeansWithType2();
for(final item in result4) {
print(item.$1);
print(item.$2);
}
final result5 = getNewJeansWithType3();
for(final item in result5) {
print(item.name);
print(item.age);
}
final result6 = getMinji();
print(result6);
}
// Record
// List를 좀 더 규격화해서 표현 할 수 있는 기능
// 타입스크립트나 파이썬의 튜플과 같다고 보면 됨
// 일반 괄호를 이용해서 사용 => ()
// 타입과 타입의 순서를 보장함
(String, int) nameAndAge(Map<String, dynamic> json) {
return (json['name'] as String, json['age'] as int);
}
List<Map<String, dynamic>> getNewJeans() {
return [
{
'name': '민지',
'age': 20,
},
{
'name': '해린',
'age': 18,
}
];
}
List<(String, int)> getNewJeansWithType() {
return [
(
'민지',
20,
),
(
'해린',
18,
)
];
}
// 이름을 붙여줄 수도 있음
List<(String name, int age)> getNewJeansWithType2() {
return [
(
'민지',
20,
),
(
'해린',
18,
)
];
}
List<({String name, int age})> getNewJeansWithType3() {
return [
(
name: '민지',
age: 20,
),
(
name: '해린',
age: 18,
)
];
}
(String name, String group, int age) getMinji() {
return ('민지', '뉴진스', 19);
}
2. Destructuring
자바스크립트, 리액트를 사용한 경험이 있으므로
Destructuring은 아주 익숙하다.
void main() {
final (name, age) = ('민지', 20);
print(name);
print(age);
final newJeans = ['민지', '해린'];
final [String a, String b] = newJeans; // 원한다면 타입을 넣어줄 수도 있음
print(a);
print(b);
final numbers = [1, 2, 3, 4, 5, 6, 7, 8];
final [x, y, ..., z] = numbers;
// ... 중간 다 먹어버림
// 한 곳에서만 사용 가능
print(x); // 1
print(y); // 2
print(z); // 8
// ... 으로 먹어버린 부분을 쓰고 싶다면?
final [xx, yy, ...rest, zz] = numbers; // => spread/rest 문법
print(xx); // 1
print(yy); // 2
print(zz); // 8
print(rest); // [3, 4, 5, 6, 7];
// 중간에 있던 값들을 다 가져옴
// 값을 무시하는 방법
// 여러 곳에서 사용 가능
final [xxx, _, yyy, ...rest2, zzz, _] = numbers;
print(xxx); // 1
print(yyy); // 3
print(zzz); // 7
print(rest2); // [3, 4, 5, 6, 7];
final minJiMap = {'name': '민지', 'age': 19};
final {'name': name3, 'age': age3} = minJiMap;
print(name3);
print(age3);
final minJiIdol = Idol(name: '민지', age: 19);
final Idol(name: name4, age: age4) = minJiIdol;
print(name4);
print(age4);
}
class Idol {
final String name;
final int age;
Idol({
required this.name,
required this.age,
});
}
3. Pattern matching (+ switch case 수정사항)
void main() {
// Validation(확인)
final minJi = ('민지', 20);
final (name as String, age as int) = minJi;
print(name);
print(age);
// switcher('aaa');
// switcher('bbb');
// switcher(['1', '2']);
// switcher([1, 2]);
// switcher([1, 2, 3]);
// switcher([4, 5, 6]);
// switcher([4, 5, 6, 7]);
// switcher([6, 9]);
// switcher([6, '9']);
switcher(7);
switcher(17);
print(switcher2(5, true));
print(switcher2(7, true));
print(switcher2(7, false));
forLooper();
ifMatcher();
}
void switcher(dynamic anything) {
switch(anything) {
case 'aaa':
print('match: aaa');
case ['1', '2']:
print('match: [1, 2]');
case [_, _, _]:
print('match: [_, _, _]');
case [int a, int b]:
print('match: [int $a, int $b]');
case < 10 && > 5: // 조건문도 사용 가능
print('match: < 10 && > 5');
default:
print('no match');
}
}
String switcher2(dynamic val, bool condition) => switch(val) {
5 => 'match: 5',
7 when condition => 'match 7 and true',
_ => 'no match', // _: default 값
};
void forLooper() {
final List<Map<String, dynamic>> members = [
{
'name': '민지',
'age': 20,
},
{
'name': '해린',
'age': 19
}
];
for(final member in members) {
print(member['name']);
print(member['age']);
}
for(var {'name': name, 'age': age} in members) {
print(name);
print(age);
}
}
void ifMatcher() {
final minJi = {
'name': '민지',
'age': 20,
};
if(minJi case {'name': String name, 'age': int age}) {
print(name);
print(age);
}
}
* 강의: 인프런 코드팩토리 Dart 언어