본문 바로가기

전체 글236

반복 작업을 할 때 NSTimer를 사용한다.(자바처럼 쓰레드로 반복할 수 있으나 권장하지 않는 방법이다)기본적인 반복은 아래와 같은 코드로 작성한다. 12345678@IBAction func startTimer(sender: AnyObject) { let interval : Double = 3 NSTimer.scheduledTimerWithTimeInterval(interval, target: self, selector: "countdown:", userInfo: nil, repeats: true) } func countdown(timer: NSTimer) { print(timer) }Colored by Color Scriptercs 다른 예제로, 1분이 지나면 얼럿뷰를 띄우는 코드를 작성해보자.12345678910111.. 2015. 10. 21.
Alert Action Sheet swift 2.0에 와서 UIActionSheet는 duplicated되었다. 기존의 Alert처럼 UIAlertController를 이용해 스타일을 적용하고, 액션을 추가한다.아래와 같은 코드를 작성하면, 12345678910let dialog = UIAlertController(title: "title", message: "message", preferredStyle: UIAlertControllerStyle.ActionSheet) let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil) let cancel = UIAlertAction(title: "cancel", style: UIAlertActionSty.. 2015. 10. 21.
mysql 1067 error 정확한 원인은 알 수 없는 이 1067 에러는 어찌됐든 서버를 실행하는데 오류가 났다는 의미이다. 그 중에서도 가장 가능성 높게 일어나는 원인은 mysql의 위치를 찾지 못해서. 왜 찾지 못하냐하면, 서비스 등록할 때 설정 파일이 제대로 적용되지 않았으니까. windows, 각종 설정 폴더, C드라이브 등등... 여러 군데에 설정파일을 위치시키라는 조언이 많지만 다 안된다. 적어도 나는 안됐다. 가장 좋은 방법이자 명확한 것은 서비스 등록할 때 설정 파일을 잡아주는 거다. 명령어는 다음과 같다. 1mysqld --install mysql --defaults-file="setting_file"cs 2015. 10. 15.
14. 타입 체크와 변환 타입 체크와 변환 swift 언어는 강한 타입 체크 언어이므로 코드를 작성할 때 변수나 상수의 타입과 값의 타입을 잘 맞춰야 한다. 배열에 저장된 객체의 타입을 체크하려면 is 를 이용한다.// is 로 타입 체크let pets : [Animal] = [Dog("snu"), Cat("ya5ng"), Cat("laz")] if pets[0] is Cat { print("고양고양")} // pets는 배열이므로 직접 타입을 지정하면 에러 발생 let myCat : Cat = pets[1] 타입 변환은 as를 이용한다.as : swift1.1까지 사용.as? : 타입 변환에 실패하면 nil이 반환된다.as! : 타입 변환이 안되면 런타임 에러가 발생한다. Swift 1.2부터 사용 Any Swift의 모든 변.. 2015. 10. 14.
13. 옵셔널 체인 옵셔널 체인 옵셔널 체인은 nil로 인한 에러 없이 옵셔널 타입을 사용할 수 있는 장점이 있다.다음 코드의 프로퍼티에 접근하려면 if let을 사용해서 nil 체크를 해야 한다. 하지만 if let을 중첩 사용하면 옵셔널의 대가로 작성해야 하는 코드의 양이 너무 많다.class Person { var phone : MobilePhone?} class MobilePhone { var number : String?} let john = Person()if let phone = john.phone { // 전화 있음 if let number = phone.number { // 번호 있음 } } 강제 언래핑을 이용해서 할 수도 있다. 하지만 swift 2.0에서 이러한 방식은 불가능하도록 변경되었다.let nu.. 2015. 10. 14.
11. 클로저 클로저 클로저(Closure)는 동작하는 코드의 단위로, 코드가 정의된 곳의 변수나 상수를 사용할 수 있다. Objective-C의 블록(block)에 해당한다. 클로저를 정의하는 형식은 다음과 같다.{ ( PARAMETERS ) -> RETURN_TYPE in// 코드} 클로저를 사용하려면 함수 타입에 대해 익숙해져야 한다. 함수 타입은 파라미터의 타입과 개수, 반환 타입으로 구성된다.파라미터가 없고 반환값이 없는 함수 타입은 () -> () 혹은 void -> void 이다.// 함수 타입(Int, Int) -> Int // 함수 구현func add(i : Int, j : Int) -> Int { return i + j } 다음은 배열을 정렬하는 sort메소드에 클로저를 사용하도록 작성한 코드이다.v.. 2015. 10. 6.
10. 프로토콜 프로토콜 자바의 interface와 같은 기능을 하는, 메소드 호출 규격을 약속한 것이다. 그러므로 메소드의 선언만 작성하며 클래스나 구조체에 채택되어 사용한다.protocol Singing { func sing()} protocol Dancing { func dance()}// static method 선언protocol Species { static func species() -> String} // 클래스에 프로토콜 적용class Bird : Singing { func sing() { print("hahah") }} // 여러 프로토콜 적용class Cat : Singing, Dancing, Species { func sing() { print("hahahen") } func dance() { pr.. 2015. 10. 6.
9. 구조체와 enum 구조체 구조체는 클래스처럼 프로퍼티와 함수를 선언한다. 클래스와 마찬가지로 구조체 객체를 생성하면서 구조체에 선언한 프로퍼티 값을 초기화해야 한다. 다만 convenience initializer의 경우 메소드에 convenience를 작성하지 않는다. 구조체는 상속을 지원하지 않으므로 부모 클래스로의 초기화 위임을 하지 않는다.struct Point { var x : Int var y : Int init() { self.x = 0 self.y = 0 }} var obj = Point() Mutating 구조체는 객체를 생성한 이후 구조체 내부에서 구조체 값을 변경할 수 없다. 초기화 메소드를 제외한 다른 메소드에서 프로퍼티 값을 설정할 수 없다. 구조체 내부에서 객체의 값을 변경하려면 메소드에 muta.. 2015. 10. 6.
8. 상속 상속과 초기화 메소드 상속했을 경우 부모 클래스와 자식 클래스에서 초기화 메소드가 동작하는 모습으로 두 종류의 초기화 방식이 다른다. 쉽게 표현하자면 Designated는 위(super)로 위임하도록 작성하고 Convenience는 옆(other Convenience or Designated)으로 위임하도록 작성한다. 초기화 메소드 상속 초기화 메소드는 자식 클래스에 제한된 경우에만 상속된다. 상속되는 첫 번째 조건은 자식 클래스에 Designated Initializer가 없는 경우다. 클래스에 그것이 없다는 것은 별도의 초기화가 필요한 프로퍼티를 선언하지 않았다는 것이다. 자식 클래스에 Convenience Initializer를 작성해도 초기화 상속이 발생한다. 자식 클래스의 객체를 생성하려면 부모.. 2015. 10. 5.