전체 글 260

4. Custom Cell

애플에서는 충분히 활용가능하고 디자인 잘 된 Cell을 제공하고 있지만 실제 앱을 만들때는 제공하는 다양하고 자신의 서비스에 맞는 데이터 표현이 각각 다르기에 Cell로 데이터 표현시 어떻게 하면 사용자 정의가 가능한지를 살펴보자. 우리는 이렇게 생긴 Custom Cell을 만들어 보려고 한다. Custom Cell의 경우 ViewController 외부에 또다른 Class로 선언되며, 당연히 이름은 알아서 지정하고, UITableViewCell을 상속받아 사용된다. 이렇게 필요한 것들을 변수로 선언하고 타입이 각각 어떤 UI 기능 인지를 지정해주면 된다. 왜 weak 키워드를 사용했는지? 왜 타입 젤뒤가 !가 되었는지? 대충 조사해보면 weak는 optional로 선언되야 한다고 했는데 !가 되었는지 ..

3. TableView 실습

Assistant를 누르면 ViewController 화면과 코드를 동시에 볼수있다. TableView를 사용하려면 UITableDataSource, UITableViewDelegate를 상속받고 알맞은 protocol을 지켜야한다.(질문에 대한 답을 해야한다.) 구조는 다음과 같다. 여기서 위 tableView는 몇개의 Cell을 보여줄것인지를 결정하는 것이다. UITableViewDataSource에 해당한다. 아래의 tableView는 cell들이 어떻게 표현되는지, 보여지는지를 정의하게 되는 것이다. TableView는 Cell을 통해서 데이터를 출력하게 되는데, 이때 이 Cell들은 재활동되어 화면에 보이는 것만큼의 Cell만 필요하게 된다. 재활용되는 셀을 가져오는 것이 tableView.de..

2. TableView를 위한 Protocol(규약, 약속)

TableView는 왜 쓰는가? 여러 데이터를 리스트형식으로 보여주고 싶을 때 사용한다. 현재 TableView를 ViewController에 추가했는데, 여기서 TableView를 사용하려 하면 TableView는 데이터를 보여주기전에 어떤 질문을 하게된다. TableView의 Cell은 몇개인가? TableView를 어떻게 보여줄까? 어떤 셀을 이용해서 보여줄것인가? TableView를 클릭하면 어떻게 할까? 등 여기서 1,2는 필수로 답을 해줘야한다. 서비스를 이용하는데 있어서 해야할 일 —> Protocol: 규약, 약속 그렇다면 TableView를 이용하기 위한 Protocol에는 어떤것이 있을까? 상속받는 UITableViewDataSource, UITableViewDelegate에서 지정해주..

1. List -> UITableView

우리는 앱을 사용하면서 데이터가 리스트형식으로 보이는 View를 많이 봐왔다. 맞다. 그거 만드는 거 배우려한다. UITableView는 여러 아이템을 리스트 형태로 보여주기 위한 View이다. column이 한 개로 구성된 특징이 있다. (하나의 데이터가 하나의 행을 차지한다는 의미이다.) 데이터들을 여러 행에 걸쳐서 보여줄 수 있다. 각 데이터들은 TableView Cell이라는 녀석을 통해 표현이 된다. TableViewCell은 다양한 스타일로 표현될 수 있다. 이미 시스템에서 제공해 주는 것이 있는가 하면, 개발자가 직접 커스텀마이징을 통해서 만들 수도 있다. TableView는 TableView Cell을 통해서 데이터를 표시하게 되는데 여기서 중요한 것은 TableView은 Cell을 재활용..

6. Styling, Auto Layout

Styling Image and Labels Styling Button Auto Layout : 다양한 해상도의 디바이스 대응하는 방법 App Icon and Display name … Image 아이폰은 3가지 사이즈의 이미지를 받아서 사용할 수 있다. 1x, 2x, 3x 는 해상도를 의미한다. 해당 사진이 어떤 해상도를 갖는지 알려줄 수 있다. @2x 이렇게 사진을 넣게되면 해상도에 맞게 사진이 지정된다. Image view에서 가볍게 GUI로 지정해서 사진을 선택할 수 있다. Assets.xcassets에 넣은 사진이나, 애플에서 제공하는 아이콘들을 사용할 수 있다. 여기서 사진이 꽉 차지 않을 경우 View에서 Content mode를 Aspect Fit이 아닌 Aspect Fill로 하면 사이즈..

5. Swift를 배우기전 알아야할 코딩지식

string는 “ ”안에서 변수를 사용할 수 있다. “가격은 \(variable) 입니다.” —> 변수에 해당하는 값이 적절히 출력된다. arc4random_uniform(10000) : 0~9999 까지의 수를 랜덤하게 반환한다. 단, 해당 반환된 수는 UInt32 type 이기에 연산시 Int로 type cast를 실행하자. var를 이용해서 만드는 변수를 variable라고 한다. let를 이용해서 만드는 변수를 constant라고 한다. var 은 변수를 담고, let은 const와 같이 변하지 않는 문자열, 상수 등을 이용한다. —> 될수 있으면 오류를 방지하지 위해 let을 많이 사용하도록 하자. let을 이용해서 constant를 생성하고, 변경이 필요한 경우에 키워드를 바꿔서 사용하는 것을..

4. Outlet 연결

화면에 레이블이 있고, 버튼이 클릭될 때마다 이 레이블의 값이 변경되고 하고 싶다면? 레이블은 보여지는 text라고 이해하면 쉽다. 그리고 코드와 연결하여 이 값을 바꾸는 작업을 하는 것이다. 다음 코드와 같이 priceLabel을 Outlet으로 설정하며, viewDidLoad()는 해당 ViewController화면이 load될때 실행되는 함수이다. priceLabel.text를 해당 문자열로 삽입하였기에, view가 load될때 해당 레이블이 숫자로 지정된 $100000가 아닌 코드로 수정해준 “$\(currentNumber)” 로 변경되어 출력된다. 그러나, load가 된 다음 currentNumber의 값이 바뀌더라도 해당 text로 load 가 되었기에 숫자는 바뀌지 않는다. 어떻게 코드 구조..

3. 앱동작 방식의 이해

앱은 여러 개의 object로 이루어져 있다. 우리가 본 object는 UI버튼, UI label, ViewController 등이 있다. 제공되는 것은 쓰면 되고 제공되지 않는 것은 만들어야 한다. 기본적으로 object들은 메세지를 보내면서 communication을 한다. 사용자가 버튼을 누르면 버튼은 ViewController에게 버튼이 클릭되었다고 알려준다. 그럼 VC는 showAlert method를 수행을 하고, UIAlertController에게 메세지를 보낸다. 이렇게 object간의 메세지를 보내게 되는데 IOS앱 자체는 이벤트발생에 따라 작동한다. 버튼클릭이라는 이벤트가 VC에게 메세지로 전달되고, 이는 그 안의 함수에게 또 메세지를 보내는 그러한 방식이다. 이 말은 즉, 앱은 항상 ..

2. ViewController을 통해 화면출력

@IBAction func hello(_ sender: Any) { let alert = UIAlertController(title: "hello", message: "My First App!!", preferredStyle: .alert) let action = UIAlertAction(title: "OK", style: .default, handler: nil) alert.addAction(action) present(alert, animated: true, completion: nil) } UIAlertController로 팝업을 만들게 되고 제목과 메세지를 입력한다. 그후 밑의 버튼은 UIAlertAction으로 만들게 되고 버튼이름은 설정가능하다. 버튼을 누르면 어떤 기능을 할지는 handler..

1. ViewController: 스크린 하나를 관리함

우리가 게시판을 만든다고 하고 게시판리스트와 게시판상세페이지 이렇게 두개의 스크린이 있다고 하면 우리는 두개의 ViewController가 필요하다. (페이지가 복잡해지면 하나의 스크린에 여러개의 ViewController를 사용하기도 함) ViewController는 2가지로 구성된다. 페이지를 디자인하는 파트 Storyboard와 연결되어 있는 코드파트로 구성된다. 그렇다면 ViewController는 무엇을 하는 것일까? 쉽게 설명하면 우리는 StoryBoard에 원하는 object library를 사용해서 적절한 디자인을 할 것이다. 그러면 버튼(레이블 등)은 지금까지 아무것도 아닌 상자일 뿐이다. 그런데 이 버튼을 눌렀을 때 어떤 반응이나 실행이 되도록 우리가 코드를 짜게 되는데, 그것이 Vie..

16. Swift Initializer(생성자)

목차 자식클래스가 새로운 형태로 Initializer를 만드는 방법 2-phase Initialization (클래스 생성시 2단계) 상속이 깊어지면 Initializer에 전달하는 파라미터의 갯수도 늘어난다. 규칙 code 1. 자식클래스가 새로운 형태로 Initializer를 만드는 방법 init(firstName: String, lastName: String, sports:[String]){ self.sports = sports super.init(firstName:firstName, lastName:lastName) // 여기서 Stored Property를 먼저 초기화한 다음에 상위 클래스의 생성자를 호출하는 것이 관례이다. 이유는 2에서 알려줄께 } // 이렇게 되면 해당 클래스의 생성자에 맞..

3. 상속은 언제 하면 좋은가?

장점: 중복되는 코드가 줄어든다. 단점: depth가 깊어지면 복잡하다. 짬에서 나오는 철학이 필요하다. Single Responsibility (단일 책임): 각 클래스는 한 개의 고려사항만 있으면 된다. -> 여러 책임을 다 가지려하면 복잡해진다. Type Safety (타입이 분명해야 할 때): 클래스 간의 명확한 구분이 필요한 경우 -> 학교 축구동아리에서 축구선수를 뽑으려고 하는데 미술부, 과학부 같이 너무 아무나 들어오게 하고 싶지 않아서 운동부 애들로 제한을 두고 싶어서 상속을 한다. Shared Base Classes(다자녀가 있다!): 기본 동작이 다양하게 구분되어야 하는 경우 -> 학생이 학습을 하는 기능이 있다면, 미술학생은 미술공부를 학습하고 체육학생은 운동공부를 학습하는 것과 같이..

15. Swift Class Inheritance (상속)

상속의 규칙 A is B -->명제가 논리적으로 성립하면 A는 B를 상속 받을 수 있다. 자식은 한 개의 superclass만 상속받는다. 부모는 여러 자식들을 가질 수 있다. 상속의 깊이는 상관없다. override: 오버라이딩 메소드의 경우 override 키워드를 삽입한다. upper casting: 상위클래스로 casting할 때, 명시적으로 (as 클래스이름) 표시할 수 있다. athelete1 = athelete2 as StudentAthlete 여기서 upper casting가 되었기에 athelete1은 이제 footballTeam에 접근할 수 없다. down casting: 하위클래스로 casting할 때이며, 안전하게 optional하게 casting된다. 정상적으로 binding가 된..

2. Struct vs. Class

목차 1. Struct와 Class의 차이 2. 언제 Struct를 사용하는가 3. 언제 Class를 사용하는가 4. 현업 개발자의 추천 1. Struct와 Class의 차이 변수 할당할 때 차이가 생긴다. Class는 이미 할당된 변수를 새로운 변수로 할당할 때 새로운 변수는 기존의 변수를 지칭하고 있다. Structure는 복사가 된다. 이렇게 동작의 차이가 생기는 이유는 뭘까? 두 타입이 생성되는 인스턴스가 컴퓨터 안에서 할당되는 메모리 공간의 차이가 있기 때문이다. Class 는 Heap영역에, Structure는 Stack영역에 할당된다. 각 영역은 다른 속성을 갖고 있다. Stack은 시스템에서 당장 실행하거나 타이트하게 control, managing해야하는 놈들은 stack에 할당한다. 그..

14. Swift Class

Struct와 Class를 정의하면서 차이를 살펴보자 Structure는 property의 값 변경을 만드는 함수는 mutating 키워드를 이용해야한다. Class의 경우 할당될 때 실행되는 생성자를 선언해야 한다. Structure도 생성자 init()를 정의할 수 있다. struct PersonStruct { var firstName: String var lastName: String var fullName: String { return "\(firstName) \(lastName)" } init(firstName: String, lastName: String){ self.firstName = firstName self.lastName = lastName } mutating func uppercas..

13. Swift Method extension

이미 만든 Structure에 메소드를 추가하고 싶다. instance, type 이던 method를 추가할 수 있다. 기존의 structure에서 코드를 추가해도 되지만 현재 코드라인에서 사용하고 싶으면(이게 가독성이 좋겠다라고 생각되면) extansion을 이용해도 된다. 그리고 협업시 모든 사람들이 해당 Structure에 접근하면 오류가 커질 수 있기에 각각 추가 코드라인을 만들어서 정상적으로 디버깅되면 추가하는 것도 좋은 방법이다. struct Math { static func abs(value: Int) -> Int { if value > 0 { return value } else { return -value } } } print(Math.abs(value: -20)) // 제곱, 반값이 필요..

12. Swift Method

function과 method의 차이: method는 instance에 귀속되어서 사용할 수 있는 것 function과 마찬가지로 기능을 수행하는 코드블록이다. function과 다르게 Structure, Class안에서 동작하는 것 이번에는 Structure와 관련된 Method에 대해 알아보자 struct Lecture { var title: String var maxStudents: Int = 10 var numOfRegistered: Int = 0 // 강의의 남은 자리수 확인하는 함수 func remainSeats() -> Int { return lec.maxStudents - lec.numOfRegistered } // swift는 var 변수라도 함부로 값을 변경하면 안된다. // func ..

1. Swift Method vs. Computed Property

의문? computed property와 메소드의 차이는 뭘까? 이미 저장된 stored property를 갖고 값을 재 가공하거나, 재 계산 할때 사용한다. 여기서 get, set의 경우 기존의 자바에서는 메소드로 만들어 줬는데 여기서는 stored property로 값을 가공하여 return 하는 computed property를 이용했다. var fullName: String { return "\(firstName) \(lastName)" } func fullName() -> String { return "\(firstName) \(lastName)" } 결론: Property : 호출시 저장된 값을 하나 반환한다. Method: 호출시 어떤 작업을 한다. 만약 Method가 그냥 값을 리텅하는 작..

11. Swift Property(속성)

Property: 속성, 데이터를 의미 Stored Property: 값이 초기화되어 저장되어있는 데이터(nil로 저장된것도 포함) Computed Property: 어떤 값을 저장하지 않고 저장된 정보를 이용해서 가공 혹은 계산된 값을 이용 접근할때마다 다시 계산이 되어 값 변경시 새로운 값을 이용해서 다시 제공한다. Protocol에서의 예시인 var description이 Computed Property이다. 꿀팁을 주자면 변수가 var로 되어있는데 값변경으로인한 오류를 막기위해 let으로 선언을 권고 struct Person { var firstName: String var lastName: String var fullName: String { return "\(firstName) \(lastNa..