Gestures화면을 통해 전달된 사용자 입력iOS에는 사용자 입력을 제스처로 인식하는 추상 레이어 존재제스처는 UIGuestureRecognizer라는 클래스의 인스턴스에 의해 인식됨UIGuestureRecognizer자체는 추상적. 생성할 일 없음. 구체화된 서브클래스 사용원하는 제스처 종류를 쓸 때 그 서브클래스들을 생성함(PanGestureRecaognizer, PinchRecognizer 등..) Recognizer 클래스 사용의 두 가지 스탭(GestureRecognizer, GestureHandler)1. 원하는 GestureRecognizer 생성 및 UIView 객체가 Recognizer를 받아서 해당 제스처를 인식할 수 있도록 설정 (Controller가 담당)2. Recognize..
브랜치를 새로 생성하지 않고 master 브랜치에서 계속 커밋했다. master를 원래대로 돌리고 새 브랜치에 커밋을 옮기기 위해서 cherrypick 명령어를 사용해봤다. 일단 커밋을 옮길 브랜치(calculator) 생성하고 체크아웃 한다 git checkout -m calculator 옮겨올 커밋의 id값을 열거한다 커밋id^..커밋id를 통해 해당 범위 내 커밋이 모두 복사할 수 있다 git cherry-pick Acommit Bcommit //열거한 커밋 A,B만 복사 git cherry-pick Acommit^..Ncommit //A~N 까지 범위로 복사 다시 mater로 돌아와서 잘못 올린 커밋들을 하드 리셋시킨다. reset에는 세 종류가 있다. 여기서 수정사항까지 다 날릴 것이기 때문에 ..
1. Text폰트로 표현되는 UIBezierPath의 모음UIBezierPath가 그려지는 높은 수준 방법 View에 UILabel을 하위뷰로 얹고 싶지 않고 drawRect로 텍스트를 그리는 방법NSAttributedString(Objective-C 클래스) 각각의 문자를 어떻게 그릴지에 대한 속성으로 구성모든 문자에 대한 설정값(컬러, 폰트 등)이 담긴 Dictionary를 가지고 있음let text = NSAttributedString("hello")text.drawAtPoint(aCGPoint)let textSize: CGSize = text.size스위프트에서 사용을 어렵게 만드는 두가지 차이점 1. 값이 변할 수 있는 특성을 var과 let으로 할 수 없음NSAttributedString을 ..
1. ViewView는 좌표공간위계구조를 가지고 있음서로 겹칠수도 있음모든 뷰는 하나의 슈퍼뷰를 가짐여러개의 자식뷰를 가질 수 있음 * UIWindowThe UIView at the very, very top of the view hirearchy(even includes status bar)가장 상위의 뷰 계층에 존재앱마다 한개씩 존재 뷰를 넣고 빼는 동작을 하는 함수addSubview는 부모뷰에, removeFromSuperView는 삭제될 그 뷰에 호출addSubview(aView: UIView) //sent to aView's(soon to be) superviewremoveFromSuperView() //this is sent to be the view you want to remove(n..
1. AnyObject프로토콜. Objective-C와 호환을 위해 사용Objective-C에서는 id라는 타입(모르는 클래스 객체에 대한 포인터) 존재Swift에서도 위와 동일한 의미로 사용됨 AnyObject은 어떨때 사용?1. prepareForSegue와 같이 인자의 타입이 적어도 두 개 이상 될 수 있을 때 사용func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject)func touchDigit(sender: AnyObject) 2. 쿠키(cookie) 반환 시쿠키는 상태를 저장하고 뭔가를 기억하고 있다가 돌려주는 값. 어떤 값인지 알 수 없다var cookie: AnyObject AnyObject은 어떻게 사용?우리가 아는 타입으로 변..
Initialization인자없는 init을 자동으로 생성init을 만든다면 인자없는 자동생성 init을 사용하지 않는다struct MyStruct { var x: Int var y: String}let foo = init(x: 5, y: "hello") init 안에서 할 수 있는 것프로퍼티 값 설정(심지어 이미 기본값을 가지고 있어도 설정 가능)상수도 설정 가능여러 init메소드에서 다른 init메소드를 한개만 호출 가능부모 클래스의 init도 호출 가능 init 안에서 반드시 해주어야 할 것init이 끝날 때는 모든 프로퍼티가 값을 가져야 함 클래스에서는 init메소드로 두개의 타입이 존재 - 지정초기화를 직접 구현하지 않아도 되는 경우: 생성자를 작성하지 않아도 모든 프로퍼티가 기본값을..
1. Arrayvar a = Array()var a = [String()let animals = ["Giraffe", "Cow", "Doggie", "Bird"] //var로 변경해야 append 가능animals.append("Ostrich")let animal = animals[5] //crash(array out of bounds)//enumerating an Arrayfor animal in animals { print("\(animal)")} Array 메소드1. filterArray의 모든 요소마다 클로져를 실행하고 true로 반환되는 요소를 포함시켜 반환filter(includeElement: (T) -> Bool) -> [T]let bigNumbers = [2, 47, 118, 5, 9]...
1. Method 파라미터 이름 : 외부이름, 내부이름을 가짐 내부이름: 메소드 내부에서 사용될 지역변수 이름. 메소드 호출시 사용되는 것 아님 외부이름: 호출 시 호출하는 사람이 사용 외부이름을 지정하지 않으면 기본적으로 내부이름이 된다 func foo(externalFirst first: Int, externalSecond second: Double){ var sum = 0.0 for _ in 0...first { sum += second } } func bar(){ let result = foo(externalFirst: 123, externalSecond; 5.5) } 외부이름을 사용하고 싶지 않으면 _ 사용 _는 default로 넣어주기 때문에 func foo(first : Int)로 지정시 f..
1. Optional 옵셔널은 모든 타입의 옵셔널이 될 수 있다 enum Optional { case None case Some(T) } let x: String ?= nil let x = Optional.None let x: String ? = "hello" let x = Optional.Some("hello") switch x { case Some(let value): y = value case None: } 옵셔널은 사슬처럼 연결될 수 있다(옵셔널 체이닝) 두 코드는 서로 같은 기능을 한다 옵셔널 체이닝이 되어있으면 앞에서부터 추출할 수 있는 값을 추출하고 추출할 수 없다면 전체표현에서 nil을 반환한다 그래서 x는 int일수도 optional일수도 있기 때문에 optional int 타입이 된다...
- Total
- Today
- Yesterday