일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- switch
- Camera
- divider
- consumer
- datetime
- transform
- ListView.builder
- controller
- reference
- multiprovider
- changenotifier
- Firebase
- 문법
- setstate
- provider
- Snapshot
- user
- borderRadius
- signout
- permission
- changenotifierprovider
- globalkey
- Stream
- Swift
- runTransaction
- platformexception
- Navigator
- swift 문법
- enum
- snackbar
- Today
- Total
목록iOS (25)
코딩하는 제리
// 스위프트 언어에서 가장 강력한 기능 중 하나. // 여러 값을 하나의 개체에 일시적으로 묶는 방법. // 어떤 타입이든 넣을 수 있음. // 저장하는 값이 모두 동일한 타입이어야 한다는 제약도 없음. let myTuple = (10, 11.1, "Jerry") // 튜플 접근법 (index) var myString = myTuple.2 // Jerry // 튜플 접근법(모든 값을 추출하여 변수 또는 상수에 할당) let (myInt, myFloat, myString) = myTuple // "_" 언더바를 넣으면 추출을 무시함 let (myInt, _, myString) = myTuple // 튜플을 생성할 때 각 값에 이름 할당 가능. let myTuple = (count: 10, length: ..
// Value 타입 (struct, enum) : 값의 복사 // Reference 타입 (class) : 값의 참조 // 클로저에서 값을 캡쳐한다? // 클로저 내부에서 외부 변수인 num 변수를 사용(print)하기 때문에 // num의 값을 클로저 내부적으로 저장하고 있는데, // 이것을 클로저에 의해 num의 값이 캡쳐 되었다고 표현함. // message 변수는 클로저 내부에서 사용하지 않기 때문에 캡쳐되지 않음. func doSomething() { var message = "Hi, Jerry" // 클로저 시작 var num = 10 let closure = { print(num) } // 클로저 끝 print(message) } // 클로저는 값을 캡쳐할 때 // Value/Referen..
// @autoclosure // 파라미터로 전달된 일반 함수를 클로저로 래핑 하는 것. // 파라미터 함수 타입 정의 바로 앞에 작성. // 실제 클로저를 전달받지 않지만, 클로저 처럼 사용 가능. // 반드시 파라미터가 없어야 함. func doSomething(closure: @autoclosure () -> ()) { } // 클로저와 다른 점은 실제 클로저를 전달하는 것이 아니기 때문에 // 파라미터로 값을 넘기는 것 처럼 ()를 통해 구문을 넘겨줄 수 있음. doSomething( 1 > 2 ) // 일반 실행 구문이나 클로저 어느 것을 적용해도 // 해당 구문을 {} 형태로 감싸서 클로저 형태로 만든 후 인자 값으로 전달 해야함. doSomething( { 1 > 2 } ) // @autoc..
// 클로저는 Named 클로저, Unnamed 클로저 두 종류 // 일반적으로 함수를 만드는 자체가 Named 클로저이다. 편의상 함수라고 부름. // 이름이 없는 함수를 익명함수. 즉, Unnamed 클로저라고 함. // 보통 Unnamed 클로저를 그냥 클로저라고 부른다. // 파라미터와 리턴이 없는 클로저 let closure = { () -> () in print("Closure") } // 파라미터와 리턴이 있는 클로저 let closure = { (name: String) -> String in return "Hello, \(name)" } closure("jerry") // 클로저에서는 Argument Label을 사용하지 않는다. 오로지 Parameter Name closure(name:..
// 열거형 // - 유사한 종류의 여러 값을 한 곳에 모아서 정의한 것. // - 요일, 월, 계절 등 // - 카멜 케이스로 정의 // - 각 case는 한 줄에 개별로도, 한 줄에 여러개도 정의 가능. enum Weekday { case mon case tue case wed case thu, fri, sat, sun } var day: Weekday = Weekday.mon day = .tue // 타입이 명확하다면 .케이스로 표현해도 됨 // 모든 enum 케이스를 포함한다면 default는 없어도 됨 // enum을 이용한 switch-case switch day { case .mon, .tue, .wed, .thu: print("평일") case Weekday.fri: print("불금") ..
// 구조체와 클래스의 차이 // - 타입캐스팅은 클래스의 인스턴스에만 허용 // - 구조체는 상속할 수 없음 // - deinit 메서드는 클래스의 인스턴스에서만 사용가능 // - 참조 횟수 계산은 클래스의 인스턴스에만 적용 // 구조체 // 구조체를 상수로 선언하면 프로퍼티 값을 변경할 수 없다. // 변수로 선언하면 내부 프로퍼티가 변수로 선언된 경우에만 값 변경 가능 struct Food { var name: String var price: Int } var favoriteFood: Food = Food(name: "sushi", price: 10000) favoriteFood.name = "pizza" favoriteFood.price = 20000 // 클래스 // 클래스 인스턴스는 참조 타입..
// if-else let someInteger = 100 if someInteger 100 { print("100 초과") } else { print("100") } // 100 // switch // 정수 타입뿐만 아니라 스위프트의 기본 타입 대부분을 지원. // 다양한 패턴과 응용이 가능 // switch 특징 // - 각각의 case 내부에는 실행 가능한 코드가 존재 해야한다. // - enum의 case 등 한정적인 비교 값이 아니라면 default 구문을 반드시 작성. // - 명시적으로 break 하지 않아도 case 마다 break. // - fallthrough 키워드로 break를 무시. // - 쉼표..
// 함수 기본 func 함수이름(매개변수1: 매개변수1타입, 매개변수2: 매개변수2타입) -> 반환타입 { return 반환값 } func sum(a: Int, b: Int) -> Int { return a+b } // 반환값이 없는 함수 func printMyName(name: String) -> Void { print(name) } // 또는 Void 안적어도 됨 func printMyName(name: String) { print(name) } // 함수 호출 sum(a: 2, b: 3)// 5 printMyName(name: "jerry") // jerry // 함수 매개변수 기본값 설정 (기본값을 가지는 매개변수는 뒤쪽에 위치시키는게 좋다고함) func printMyName(name: Stri..