3. 각 UITabBarItem에 대해 클래스를 RAMAnimedTabBarItem으로 설정.
4. 각 RAM에 대한 사용자 지정 이미지 추가AnimedTabBarItem
5. 각 RAMAnimedTabBarItem에 대한 애니메이션 추가: - NSObject 항목을 ViewController에 끌어다 놓기 - 클래스를 ANIMATION_CLASS로 설정(여기서 ANIMATION_CLASS는 사용하려는 애니메이션의 클래스 이름임) - RAMAnimedTabBarItem의 아웃렛 애니메이션을 ANIMATION_CLASS 시연 비디오에 연결 5단계
객체: 클래스에서 생성된 변수, 클래스에서 파생되어 나오는 것, 혼자서 존재하는것은 의미가 없다. 그 객체와 다른 객체들간의 상호작용이 있을때 의미가 있다.
객체지향프로그래밍: 객체들을 설정하고 그 객체들간의 관계를 설계하는 것
내가 필요한 객체가 뭔지를 설계 하는 것
각 객체들간의 어떤형태로 상호작용을 하도록 만들것인지
1
"많은 개체들이 공통된 명칭을 가질 때 그것들은 언제나 또 하나의 이데아, 즉 형상을 갖는다. 가령 침대는 무수히 많지만 침대의 이데아, 즉 그 형상은 오직 하나이다. 여러가지 개개의 침대는 실재가 아니며 오직 그 이데아의 모사(模寫)에 의해 만들어졌을 뿐이다.” - 플라톤
let x = 5// struct, Stack에 저장 let y = User() // class, Heap에 저장 let z = User() // class, Heap에 저장 x y z [Stack] | 5 | 0x5F17 | 0x2C90 | // Stack -> 처음부터 만들어지는 시점, 크기가 지정되어짐 0x2C900x5F160x5F17 [Heap] | z's user data | SomeData | y's user data | // Heap -> 실제데이터는 힙에저장. 참조타입.
classLazyStoredProperty{ var width = 10.0 var height = 20.0 // 1. 외부 요인이나 다른 설정에 기반 lazyvar area = self.width * self.height // lazy를 붙여주면 초기화가 끝나지 않아도 사용이 가능(area를 호출할때 비로소 만들어지기 때문) // 2. 계산 비용이 많이 드는 상황 lazyvar hardWork = "실행하면 약 10초 이상 걸려야 하는 작업" // 화면을 띄우는순간 꼭 필요한 작업이 아닌데 lazy가아닌 일반 프로퍼티로 있으면 이작업을 실행후 화면을 띄울수 있기 때문에 사용자가 어떤 버튼을 눌렀을때만 필요한 작업이라면 미리할 필요가없기 때문에 이런상황에서 사용 // 3. 필요한 경우가 제한적인 상황(대부분 else로빠지는데 5% 상황만 true를 사용할때 메모리를 조금이라도 더아끼기 위해 초기화과정도 하지 않고 넘어가기 위해) funcifStatement() { iftrue { // 5% print(area) } else { // 95% print(width) } } }
Computed Property(연산&계산 프로퍼티)
자료를 저장하지 않고 매번 호출할 때마다 새로 계산
Class ⭕️ Structure ⭕️ Enumeration ⭕️
1 2 3 4 5 6 7 8 9 10
// Computed Property 사용 var <#variablename>: <#type> { get { <#statements> } set { <#variablename> = newValue } } // 읽기전용 get, 쓸때는 set 도 붙임
get: 연산프로퍼티를 호출할때 보여지는 구간
Set: 연산프로퍼티에 값을 입력했을때 실행되는 구간 / 값을 저장할수 없으므로 저장프로퍼티를 이용한다.
let square = TypeProperty() // 타입을 객체로 만들어서 프로포티에 접근 square.width
let square1 = TypeProperty() square1.width = 10.0// width의 값을 바꿔준다 square1.width
TypeProperty.unit //타입자체에서 프로포티에 접근하는 방식 = 타입 프로포티 // = "cm" print("\(square.width) \(TypeProperty.unit)") // 5.0 cm print("\(square1.width) \(TypeProperty.unit)") // 10.0 cm
TypeProperty.unit = "m" //단위를 전체적으로 바꾸고싶을때 unit자체를 바꿔준다. 모든 객체들이 공통으로 사용해야할 놈을 공유한다. print("\(square.width) \(TypeProperty.unit)") // 5.0 m print("\(square1.width) \(TypeProperty.unit)") // 10.0 m
var red, green, blue: Double red = 255.0 green = 150.123 blue = 75
Type Inference
변수 선언 시 값을 통해 변수의 타입을 추론하는 것
1 2 3 4 5 6 7 8 9 10 11
let name: String = "Babo" type(of: name) // String.type
let age: Int = 7 type(of: age) // Int.type
var weight = 48.3 type(of: weight) // Double.type
var isDog = true type(of: isDog) // Bool.type
Literals & Types
리터럴: 고정된 값으로 표현되는 문자 그 자체
정수 / 실수 / 문자 / 문자열 / 불리언 리터럴 등
Operator
Ternary Operator 삼항연산자
결과: ? 앞의 식이 참일때 True : False
1 2 3 4 5 6 7
a > 0 ? "positive" : "zero or negative"
if a > 0 { // 삼항연산자와 동일하게 동작 "positive" } else { "negative" }
Assignment Operators 할당연산자
1 2 3 4 5 6 7 8 9 10 11 12
value += 1 //value = value + 1 위와같은 value -= 5 //value = value - 5 value *= 2 //value = value * 2 value /= 2 //value = value / 2 value %= 2 //value = value % 2 //나머지가 나옴
// 미지원 : value++, value--
Arithmetic Operators 산술 연산자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 실수에서의 나눗셈 let e = 123.4 let f = 5.678
e / f // 단순히나누면 나머지가 틀림: 21.73300457907714
// 실수로 나머지를 구할때 사용 // 나머지 구하기 (내림) e.truncatingRemainder(dividingBy: f) // 4.162000000000007
// 나머지 구하기 계산 방법 let quotient = (e / f).rounded(.towardZero) // 몫: 21 let remainder = e.truncatingRemainder(dividingBy: f) //나머지: 4.162000000000007 let sum = f * quotient + remainder // 123.4 5.678 * 21// 119.238 5.678 * 21 + 4.162000000000007// 123.4
/* 함수 function1을 만들고, 그안에 또다른 함수를 중첩 해넣는다. if 문을 사용하여 function1의 함수의 파라미터 네임을 사용해 만들어서 true, false일때 다른값이 나오도록 한다. */ funcfunction1(backward: Bool, value: Int) -> Int { funcstepForward(input: Int) -> Int { return input + 1 } funcstepBackward(input: Int) -> Int { return input - 1 } if backward { return stepBackward(input: value) } else { return stepForward(input: value) } }
var value = 4 chooseStepFunction(backward: true, value: value) // 3 chooseStepFunction(backward: false, value: value) // 5
LESSON1. h: 왼쪽 j:아래 k:위 l:오른쪽 w:다음단어 시작으로 점프 b:이전단어 시작으로 점프 0: 행의 처음으로 점프 $: 행의 끝으로 점프 gg: 문서 첫 행으로 점프 G: 문서 마지막 행으로 점프 숫자G: 숫자행으로 점프 <esc> :q! <enter> 수정내용을 무시한 채로 빠져나가려면 <esc> :wq <enter> 저장 후 빠져나가려면
LESSON2. -삽입: i를 누르고 텍스트를 입력하고 <esc>를 누른다. 참고) <esc>는 명령모드로 돌아가는데 쓰며, 원치 않는 명령이나 완전히 입력되지 않은 명령을 취소할때도 쓴다. -삭제: 명령모드에서 커서가 위치한 곳의 글자를 지우려면 x입력. dw: 한 단어를 끝까지 지울때 d$: 그 줄끝까지 지울때 dd: 한줄 지울때 '4dd'=4줄지움 -삭제명령 d의형식은 [횟수] d 대상(w,e,$) / 횟수는 입력안하면 기본값=1 -취소: u를 누르면 마지막 명령이 취소 / U는 줄전체를 수정
LESSON 3. -p: 이미 지운 내용을 되돌릴때 -r: delete와 같음. 수정할 글자에서 r누르고 바꾸어 넣을 글자를 입력 -cw: 커서 위치에서 단어의 끝까지 바꿀 때 -c$: 줄 끝까지 바꿀 때
LESSON 4. 1.위치 -SHIFT+G를 누르면 파일 내의 줄로 이동 -ctrl+g: 파일 이름과 현재 위치한 줄 표시 -SHIFT+G: 파일의 맨 마지막으로 이동 -돌아가야할 줄을 입력후 shift+g를 누르면 그줄로 이동
2.찾기 -/를 누르고 검색할 문구 입력(아래 방향으로 찾음) -?를 누르고 검색할 문구 입력(위 방향으로 찾음) -n: 같은 문구를 다시 찾을 때 -SHIFT+N: 같은 문구를 반대방향으로 찾을 때
3.%: 괄호 짝 찾기 (,[,{ 커서를 놓고 %누르면 짝 찾아줌 -짝이 맞지 않는 괄호가 있는 프로그램을 디버깅할 때 매우 유용
4.에러수정 어떤 줄에 처음 등장하는 old를 new로 바꾸려면 :s/old/new 한 줄에 등장하는 모든 old를 new로 바꾸려면 :s/old/new/g 두 줄 #,# 사이에서 치환을 하려면 :#,#s/old/new/g 파일 내의 모든 문구를 치환하려면 :%s/old/new/g 바꿀 때마다 확인을 거치려면 'c'를 붙여서 :%s/old/new/gc
LESSON 5. - :!를 이용해 외부 명령 실행 :!ls - 디렉토리의 목록을 보여준다. :!rm FILENAME - FILENAME이라는 파일을 지운다. :W name -현재 사용하는 파일을 name라는 이름으로 저장. :#,#w name -#부터 #까지의 내용을 name라는 이름으로 저장. :r name -디스크에서 name라는 파일을 불러들여 커서 위치 뒤에 넣는다.
LESSON 6. o: 아래에 줄만들고 편집모드 O: 위에 줄만들고 편집모드 a: 다음에 글을 입력(i누르고 글자넣고 하는 번거로움 생략) A: 그 줄의 끝에 글을 추가 R: 하나 이상의 글자를 변경(r은 한개만 변경 하고 자동종료) -옵션(set)설정- :set ic (대소문자 구별 없이 찾음) :set hls is (찾은 내용을 강조시킴) :nohlsearch (강조없애기)