Programming/iOS2015.02.11 15:35

다국어 지원을 위해 NSLocalizedString 을 하면 아이폰 디바이스의 언어 설정으로 문자열을 가져옵니다.

만약 앱 안에서 언어 설정을 변경하고 싶다면 어떻게 해야 할까??


검색을 해보면 가장 많이 나오는 방법은 아래와 같다.


[[NSUserDefaults standardUserDefaults] setObject:@[ @"ko" ] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];


NSLocalizedString이 AppleLanguages에 설정된 언어에서 가져오므로 잘 동작한다.

하지만 문제는 앱을 재 실행해야 한다는 것이다. 설정 하나 바꿨다고 앱을 재 실행하라고??


내가 찾은 방법은 다국어를 가져올때 특정 언어 Bundle에서 가져오도록 하는 것이다.


NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"ko"];
NSBundle *localizableBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]];
NSLocalizedStringFromTableInBundle(key, nil, localizableBundle, nil);


위 코드에서는 디바이스 언어와 상관없이 모두 한국어로 다국로 문자열을 가져오게 하였습니다.

이 코드를 적용해도 바로 화면의 언어들이 변경되지는 않을 것 입니다.

추가 적으로 뷰를 새로 그려지게 하면 됩니다. 언어를 일일이 다시 설정하는 방법도 있겠지만..... 전 window.rootViewController를 새로 설정했습니다.


AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
appDelegate.window.rootViewController = viewController;


이제 설정할때마다 새로 화면을 불러와서 원하는 언어대로 표시합니다~!


신고
Posted by 초프(초보 프로그래머)
Programming/iOS2015.01.27 17:16

실행할 디바이스가 시뮬레이터인지 아닌지를 확인하는 매크로가 있다.

이걸 확인하는 방법은

#ifndef TARGET_IPHONE_SIMULATOR

#endif

가 아니다!!!!

#if !TARGET_IPHONE_SIMULATOR

#endif

이거다....

신고
Posted by 초프(초보 프로그래머)
TAG ios, Xcode
Programming/iOS2014.09.04 23:54

xcode osx 10.5 -> 10.6 으로 변경한 경우 발생한 에러


문제발생

xcode osx 10.5 -> 10.6 으로 변경한 경우 발생한 에러


해결방법

In build settings set "Implicitly link Objective-C Runtime Support" to NO.


출처

http://stackoverflow.com/questions/15433262/updating-older-code-from-os-x-10-6-to-10-7

신고
Posted by 초프(초보 프로그래머)
TAG OSX, Xcode
Programming/iOS2014.06.20 00:31

변수/상수

변수와 상수는 이름을 가지고 있다. 상수는 값을 변경할 수 없다. 변수는 값을 변경할 수 있다.


변수/상수 선언

변수의 type은 한번 정해지면 변경될 수 없다.

상수는 let 키워드로 선언하고 변수는 var 키워드로 선언한다.

  • let maximumNumberOfLoginAttempts = 10
  • var currentLoginAttempt = 0

한번에 여러 변수/상수를 선업할 수 있다.

  • var x = 0.0, y = 0.0, z = 0.0


타입 지정 (Type Annotations)

변수/상수를 선언할때 type을 명확하게 하기 위해 type을 지정할 수 있다.

welcomeMessage 이름의 변수가 String값을 가지게 된다면 

  • var welcomeMessage: String

(:)이 의미하는건 `... 의 type이 ... 이다` 

즉, welcomeMessage 의 type이 String 이다.

이건 String의 값만 저장할 수 있다는 말이다. nil도 허용되지 않는다.


변수/상수 네이밍

유니코드에 포함된 모든 문자로 네이밍할 수 있다. 즉, 한글도 가능!

  • let π = 3.14159
  • let 你好 = "你好世界"
  • let 개발자 = "초프"

이름에는 수학기호, 화살표, 내부에서 사용하는 유니코드, line-drawing, box-drawing등은 포함할 수 없다. 이름에 수가 포함될 수 있지만 수로 시작할 수 없다. test1234는 가능하지만 1234test는 불가능하다.

한번 선언된 이름으로 다시 선언할 수 없다.

변수는 호환 가능한 type이라면 대입하여 현재 값을 대체할 수 있다.

  • var friendlyWelcome = "Hello!"
  • friendlyWelcome = "Bonjour!"
  • // friendlyWelcome is now "Bonjour!"

상수는 변수와 다르게 한번 정해진 값은 변경할 수 없다. 변경을 시도하면 컴파일 오류가 발생한다.

  • let languageName = "Swift"
  • languageName = "Swift++"
  • // this is a compile-time error - languageName cannot be changed


변수/상수 출력

print, println 전역 함수를 사용하여 값을 출력할 수 있다. print 는 단순 출력이고 println은 출력 후 개행문자를 출력하여 다음줄로 이동한다.

  • println(friendlyWelcome)
  • println("This is a string")

문자열 안에 변수/상수 값을 출력하고 싶으면 변수명을 소괄호() 로 감싸고 앞에 sbackslash(\) 를 붙이면 된다.

  • println("The current value of friendlyWelcome is \(friendlyWelcome)")
  • // prints "The current value of friendlyWelcome is Bonjour!"


주석

C, Objective-C 의 주석과 동일하다. 한줄 주석은 slash(/) 두개로 시작한다.

  • // this is a comment

블럭 주석은 /* 로 시작하여 */ 로 끝난다.

  • /* this is also a comment,
  • but written over multiple lines */

기존 언어와 다른 점은 블럭 주석안에 블럭 주석도 허용한다는 것이다. 가장 바깥에 있는 주석이 적용된다.


Semicolons

다른 많은 언어들과 다르게 세미콜론(;)이 필요하지 않다. 다른 언어들은 명령 한줄이 끝나면 세미콜론으로 줄로 끝을 알려준다. 하지만 Swift에서는 필요없다. 하지만... 원한다면 사용해도 된다. 여러 명령을 한줄에 쓰고 싶다면 써야 한다.

  • let cat = "A"; println(cat)
  • // prints "A"


정수

소수부분이 없고 부호를 포함하는 수이다. 부호를 포함하는 signed(음수,0,양수)와 부호가 없는 unsigned(0, 양수)가 있다.

Swift는 8, 16, 32, 64 bit의 정수를 제공한다. 이 정수들의 네이밍은 C와 유사하다. 예를 들어 8bit unsigned 정수이면 UInt8, 32bit signed 정수는 Int32 이다. 대문자를 구분한다.


정수 범위

각 정수 type에 min, max 속성이 있어 최소,최대 값을 알 수 있다.

  • let minValue = UInt8.min // minValue는 unsigned 정수 최소값인 0이다.
  • let maxValue = UInt8.max // maxValue는 unsigned 정수 최대값인 255이다.


Int

대부분의 경우 정수의 사이즈를 지정하지 않아도 된다. Swift는 추가적으로 Int type을 제공한다. 현재 플랫폼의 native word size와 같은 크기의 정수 type의 크기가 된다.

32bit 플랫폼에서는 Int는 Int32와 같다.

64bit 플랫폼에서는 Int는 Int64와 같다.


UInt

Int와 같이 unsigned int인 UInt도 제공한다. 크기는 Int와 똑같은 방법으로 정해진다.

32bit 플랫폼에서 UInt는 UInt32와 같다.

64bit 플랫폼에서 UInt는 UInt64와 같다.


부동 소수점 수

소수부분이 포함되는 수이다. 3.14159, -273.15

정수보다 더 큰 범위의 수를 나타낼 수 있다. Swift에는 2개의 부동 소수점 수 type을 제공한다.

Double - 64bit 부동 소수점 수. 매우 큰 수, 특별히 정확해야 할때 사용한다.

Float - 32bit 부동 소수점 수. 64bit 의 정확도가 필요 없을때 사용한다.


Type Safety and Type Inference

Swift는 type safe한 언어이다. 값 type을 명확하게 해준다. String인 변수에 Int값을 대입할 수 없다.

Type-checking은 다른 type의 값을 사용하면서 발생할 수 있는 오류를 피하게 해준다. 그렇지만 모든 변수, 상수 선언에 type을 지정해야 하는 것은 아니다. 원한다면 type을 지정하지 않아도 된다. Swift는 알아서 적절한 type을 추론해준다. 

C, Objective-C보다 변수/상수 선언이 간단해졌지만 여전히 명확한 type이 존재한다. type을 지정하는 일을 대신해준다.

type 추론은 변수/상수 초기값을 지정한 선언에서 유용하다. 선언할때 값만 넣어주면 된다. 

예를 들어 type지정 없이 42로 초기화 하면 수처럼 보이기 때문에 Swift는 Int로 추론한다.

  • let meaningOfLife = 42
  • // meaningOfLife is inferred to be of type Int

만약 type 지정없이 부동 소수점 수로 초기화 하면 Double로 추론된다.

  • let pi = 3.14159
  • // pi is inferred to be of type Double

Float이 아닌 항상 Double로 추론된다.

만약 정수와 부동 소수점 수 를 같이 사용한다면 Double로 추론된다.

  • let anotherPi = 3 + 0.14159
  • // anotherPi is also inferred to be of type Double

3은 type이 지정되어 있지 않다. 이 식의 type은 소수부분이 존재하므로 Double로 추론된다.


Numeric Literals

정수는 다음과 같이 쓰여진다.

  • 10진수는 접두사 없음
  • 2진수는 점두사 0b
  • 8진수는 접두사 0o
  • 16진수는 접두사 0x

10진수 정수 17은 다음과 같이 표현될 수 있다.

  • let decimalInteger = 17
  • let binaryInteger = 0b10001
  • let octalInteger = 0o21
  • let hexadecimalInteger = 0x11

부동소수점 수는 10,16진수로 표현 가능하다. 선택적으로 승을 표현할 수 있다. 10진수에는 밑이 10인 대소문자 e, 16진수에는 밑이 2인 대소문자 p로 승을 표현한다.

1.25e2 는 1.25 x 10^2 또는 125.0 이다.
1.25e-2 는 1.25 x 10^(-2) 또는 0.0125 이다.

0xFp2 는 15 x 2^2 또는 60.0 이다.
0xFp-2 는 15 x 2^(-2) 또는 3.75 이다.

아래 3개의 상수는 모두 12.1875 값을 가진다.

  • let decimalDouble = 12.1875
  • let exponentDouble = 1.21875e1
  • let hexadecimalDouble = 0xC.3p0

Numeric literals에는 읽기 쉽게 하기 위해 여분의 형식이 존재한다. 정수, 실수 모두 숫자 앞에 여분의 0 을 붙이거나 밑줄을 포함할 수 있다. 밑줄은 무시되고 앞에 있는 0또한 무시된다.

  • let paddedDouble = 000123.456
  • let oneMillion = 1_000_000
  • let justOverOneMillion = 1_000_000.000_000_1


Numeric Type Conversion

일반적인 경우 정수 변수, 상수에서 음수가 되지 않는다고 해도 Int를 사용해라. 모든 경우 기본 정수 type을 사용하면 플랫폼에 상관없이 동일한 크기의 type이 지정되므로 호환성이 좋아진다. 

  • var numberA : Int8 = 1
  • var numberB : Int16 = 2
  • numberB = numberA
  • numberA = numberB

numberA, numberB 가 모두 정수라고 해도 8bit, 16bit 크기가 다르므로 서로 호환가능하지 않다. 서로 다른 타입이라고 보면 된다. 그래서 b = a, a = b는 컴파일 오류가 발생한다. Int8을 Int16으로 변환할 수 없고 Int16을 Int8로 변한할 수 없기 때문이다.

성능, 메모리 사용, 최적화 등 직접 다뤄야하는 특별한 상황일때만 기본 Int, UInt가 아닌 다른 정수 type을 사용하자.


정수 변환

각 정수 type에 따라 저장될 수 있는 값의 범위가 다르다. 

Int8 : -128 ~ 127
UInt8  : 0 ~ 255

값이 유요한 범위에 맞지 않는다면 컴파일 오류가 발생한다.

  • let cannotBeNegative: UInt8 = -1
  • let tooBig: Int8 = Int8.max + 1

케이스별로 정수변환을 허용해줘야 한다. 이 방법은 변환중 발생할 수 있는 에러를 방지한다.

다른 type으로 변환하기 위해서는 원하는 타입으로 새로운 수를 초기화 해줘야 한다.

  • let twoThousand: UInt16 = 2_000
  • let one: UInt8 = 1
  • let twoThousandAndOne = twoThousand + UInt16(one)

twoThousand + one 은 서로 다른 type이라 계산이 불가능하다. 하지만 UInt16(one)을 해주므로써 one의 값을 UInt16 type의 값으로 새로 만든다. twoThousand 와 type이 같아져서 계산이 되고 twoThousandAndOne은 UInt16으로 추론된다.

SomeType(ofInitialValue)는 Swift에서 변환하는 기본적인 방법이다. UInt16에는 UInt8의 값을 받을 수 있는 초기화가 있어서 기존에 있던 UInt8의 값으로 새로운 UIn16을 만들 수 있다. 여기에 아무 type이나 넣으면 안된다. 초기화에 정해진 type만 가능하다. 


정수와 부동소수점 수 변환

정수와 부동소수점 수 사이에 변환도 정수변환과 같이 명확하게 type을 지정해 줘야 한다.

  • let three = 3
  • let pointOneFourOneFiveNine = 0.14159
  • let pi = Double(three) + pointOneFourOneFiveNine
  • // pi는 3.14159 이 되고 Double type으로 추론된다.

three가 새로운 Double로 만들어 진다. 그럼 pointOneFourOneFieNine과 같은 Double type이 된다. 변환없이는 계산이 허용되지 않는다.

부동소수점 수 에서 정수로 변환도 가능하다. 정수로 변환하면 소수점 부분은 모두 버려진다.

  • let integerPi = Int(pi)
  • // integerPi equals 3, and is inferred to be of type Int


Type 별칭 (Type Aliases)

존재하는 type 을 다른 이름으로 별칭을 정의할 수 있다. C 계열의 typedef와 같다. typealias 키워드를 이용하면 된다.

존재하는 type을 좀더 적절한 이름으로 변경할때 유용하다.

  • typealias AudioSample = UInt16
  • var maxAmplitudeFound = AudioSample.min
  • // maxAmplitudeFound is now 0

AudioSample.min 은 UInt16.min과 같다.


Booleans

Swift에는 기본 Boolean type을 제공하며 Bool이라고 한다.  true, false 값만 가질 수 있다.

  • let orangesAreOrange = true
  • let turnipsAreDelicious = false

bool 값으로 초기화 되서 orangesAreOrange, turnipsAreDelicious 는 모두 Bool로 추론된다.

Bool은 조건문에서 유용하다. 

  • if turnipsAreDelicious {
  • println("Mmm, tasty turnips!")
  • } else {
  • println("Eww, turnips are horrible.")
  • }
  • // prints "Eww, turnips are horrible."

C, Objective-C와 다르게 true,false가 아닌 값이 true,false를 대신할 수 없다. Java와 같이 Bool은 Bool이어야 한다.

  • let i = 1
  • if i {
  • // i는 Bool이 아니라 Int이기 때문에 컴파일 오류가 발생한다.
  • }
  • let i = 1
  • if i == 1 {
  • // == 로 논리 비교를 하였기 때문에 결과는 Bool이 되어서 문제가 없다.
  • }


Tuples

single compound value안에 여러개의 값을 그룹화 시켜준다. 

  • let http404Error = (404, "Not Found")
  • // http404Error is of type (Int, String), and equals (404, "Not Found")

http404Error는 (Int, String) type의 튜플이다.

튜플은 많은 타입을 포함할 수 있다.

튜플의 값들은 변수/상수로 분해될 수 잇다.

  • let (statusCode, statusMessage) = http404Error
  • println("The status code is \(statusCode)")
  • // prints "The status code is 404"
  • println("The status message is \(statusMessage)")
  • // prints "The status message is Not Found"

튜플 중 특정 값만을 원한다면 무시할 부분에는 밑줄(_)을 이용하면 된다.

  • let (justTheStatusCode, _) = http404Error
  • println("The status code is \(justTheStatusCode)")
  • // prints "The status code is 404"

array처럼 각각의 element에 접근할 수 있다. 시작은 0부터이다.

  • println("The status code is \(http404Error.0)")
  • // prints "The status code is 404"
  • println("The status message is \(http404Error.1)")
  • // prints "The status message is Not Found"

각각의 element에 이름을 정의할 수 있다.

  • let http200Status = (statusCode: 200, description: "OK")
  • println("The status code is \(http200Status.statusCode)")
  • // prints "The status code is 200"
  • println("The status message is \(http200Status.description)")
  • // prints "The status message is OK"

함수의 return값으로 쓰기에 유용하다. 하나의 type을 return받는 것 보다 더 많은 유용한 정보를 받을 수 있다.


나머지는.... 다른 곳에 번역이 너무 잘 되어 있어서 이만 한다...

나도 이제 번역된거 봐야지~ ㅋ

신고
Posted by 초프(초보 프로그래머)
TAG ios, swift
Programming/iOS2014.06.18 12:21

개인적으로 공부하기 위해 번역해서 남겨둔다.


Swift에는 2가지 type이 있다.

  • named types
    • 이름이 정해진 type이다.
    • class, struct, enumeration, protocol 를 포함한다.
    • 사용자가 만든 임의의 class이름을 Person 이라고 하면 Person또한 named type이며 user-defined named type이라 한다.
    • standard library에는 array, dictionary 등 많은 named type들이 제공된다.
    • data type은 number, character, string 등의 named type 을 말한다. Swift standard library에 structur로 구현되어 있다. 필요에 따라서 원하는 동작을 extend할 수 있다. (objc에 있는 extend기능을 말한다. swift에도 있음)
  • compound types
    • 이름이 없다.
    • named type과 다른 compound type을 포함한다.
      예) (Int, (Int,Int)) -> named type Int와 compound type(Int,Int)로된 compound type
    • 두가지의 compound type이 있다.
      • function type
      • tuple type


Type Annotation

변수나 식의 타입을 명시적으로 지정한다.

  • let someTuple: (Double, Double) = (3.14159, 2.71828)

someTuple은 (Double, Double)의 tuple type으로 지정되었다.

  • func someFunction(a: Int) { /* ... */ }

parameter a는 Int type으로 지정되었다.


Type Identifier

type identifier는 named type이거나 named/compound type의 별칭(alias)이다.

(C계열의 typedef 와 유사)

  • typealias Point = (Int, Int)

(Int, Int) tuple type을 Point라는 이름으로 type identifier를 지정함.

  • let origin: Point = (0, 0)

하나의 type형태로 사용할 수 있음. 다음과 같은 의미이다.

  • let origin: (Int, Int) = (0, 0)
  • var someValue: ExampleModule.MyType

다른 모듈이나 다른 type에 중첩된 type일 경우 . 을 사용하여 identifier를 이용할 수 있다.


Tuple Type

중괄호 안에서 comma(,)로 구분된 0개 이상의 type list 이다.

ex) (), (Int), (Int, Double) 

tuple type은 함수 return에서 사용한다. 함수에서 2개 이상의 값을 하나의 tuple type로 return할 수 있다.

element name은 colon(:) 다음에 identifier로 되어 있다. 

ex) (name : String, age: Int)

Void 는 비어있는 tuple type이다. ()

하나의 element만 있다면 tuple type이 아닌 element type이 된다.

(Int)는 (Int)가 아니라 Int이다.


Function Type

(->) 로 구분되는 parameter, return type으로 구성된 function, method, closure 의 type을 function type이라 한다.

  • parameter type -> return type

parameter type, return type은 tuple type도 가능하다. 일반 function, method와 같이 0개 이상의 parameter, 0개 이상의 return value을 지원한다. (parameter, return이 일반 function, method와 같다고 보면 됨)

parameter type이 ()이고 return이 있을 경우 auto_closure attribute를 적용할 수 있다.

autoclosure function은 특정 expression을 캡쳐 한다.

  • func simpleAssert(condition: @auto_closure () -> Bool, message: String) {
  • if !condition() {
  • println(message)
  • }
  • }
  • let testNumber = 5
  • simpleAssert(testNumber % 2 == 0, "testNumber isn't an even number.")

(testNumber %2 == 0 이 캡쳐되어 condition이 된다)

가변 인자 매개변수(variadic parameter) 는 parameter type중 가장 마지막에 위치해야 한다. 문법적으로 가변 인자 매개변수는 기본 type name과 그 뒤에 점 세개 (...) 로 구성된다. ex) Int...  
가변 인자 매개변수는 array로 취급된다. Int... 은 Int[] 로 취급된다.

in-out parameter를 사용하기 위해서 parameter type 접두사로 inout keyword를 붙여준다. 가변 인자 매개변수에는 inout keyword를 쓸수 없다.

커리함수(curried function)은 중첩 function type과 같다. 예를 들어 

  • func addTwoNumbers(a: Int)(b: Int) -> Int {
  • return a + b
  • }
  • addTwoNumbers(4)(5) // Returns 9

커리함수의 function types은 오른쪽에서 왼쪽으로 그룹화된다. 예를 들어 Int->Int->Int 는 Int->(Int->Int)이다. parameter로 Int를 받아서 (Int->Int) 라는 함수를 return한다. 


Array Type

named type Array<T>를 사용한다. 문법적으로 간단하게 type 이름 뒤에 대괄호([])를 이용합니다. 

아래 두개의 문법은 동일하다.

  • let someArray: String[] = ["Alex", "Brian", "Dave"]
  • let someArray: Array<String> = ["Alex", "Brian", "Dave"]

someArray[0] 은 index 0인 element 인 "Alex"이다. (다른 언어 array와 동일)


Optional Type

named type Optional<T>를 문법적으로 간단하게 하기 위해 Swift에서는 접미사 (?)를 정의했다. 아래 두개의 문법이 동일하다.

  • var optionalInteger: Int?
  • var optionalInteger: Optional<Int>

Optional<Int>는 선택적으로 Int를 가질 수 있다. type name 과 (?) 사이에는 빈 공간(whitespace)이 있으면 안된다.

Optional<Int>는 None, Some(T) 두가지 경우가 있다. 모든 type이 optional type으로 선언 가능하다. 중괄호()로 범위를 지정하여 (?)를 사용할 수 있다. ex) (Int[])?

만약 초기값을 지정하지 않는다면 기본으로 nil 값이 된다.

Optional은 LogicValue protocol을 따르므로 Boolean 이 된다. optional type T? 가 type T 의 어떠한 값이라도 가진다면 true와 같고 아니라면 false이다.

(!)연산자를 사용하면 optional 을 해제하여 nil 값을 가지고 있으면 runtime error를 발시킨다. 

즉 optional type은 wrap되어 있어 그 자체로 true/false로 나타낼수 있다. 하지만 정확히 값을 표현하고 싶을때 접미사로 (!) 연산자를 사용하면 optional type이 해제되어 실제 값으로 표현되는데 optional type이 아니므로 nil이 존재할 수 없다. 만약 nil이라면 runtime error가 발생한다.

optional expression 에서 연산자를 조건적으로 수행하기 위해 optional chaining, optional binding 을 사용할 수 있다. 만약 값이 nil이라면 실행할 연산자가 없어 runtime error가 발생된다.


Implicitly Unwrapped Optional Type

named type ImplicitylyUnwrappedOptional<T> 를 간단하게 표현하기 위해 접미사로 (!) 연산자가 정의되어 있다. 아래 두개의 정의는 같다.

  • var implicitlyUnwrappedString: String!
  • var implicitlyUnwrappedString: ImplicitlyUnwrappedOptional<String>

implicitlyUnwrappedString은 암시적 unwrapped optional string으로 선언되어 있다. type과 연산자 (!) 사이에는 공백(whitespace)가 없어야 한다.

암시적 unwrapped optional 은 optional을 사용하는 모든 곳에서 사용 가능하다.

선언할때 초기값을 지정하지 않으면 nil값으로 초기화된다.

암시적 unwrapped optional 은 사용할때 자동적으로 unwrapped 된다. 그러므로 unwrap하기 위해 (!)연산자를 사용하지 않아도 된다.

만약 nil값에 암시적 unwrapped optional 을 사용하면 runtime error가 발생한다.

조건적인 수행을 위해 optional chaining을 사용한다. 만약 값이 nil이면 실행할 연산자가 없어 runtim error가 발생된다.


Protocol Composition Type

지정된 protocol들을 각각 따르는 type..... 즉 지정된 protocol을 다 상속받은 protocol이라고 보면된다.

type annotations이나 generic parameters 에 사용된다.

  • protocol<Protocol 1, Protocol 2>

protocol<ProtocolA, ProtocolB, ProtocolC> 는 ProtocolA, ProtoclB, ProtocolC 를 상속받은 이름없는 protocol이다.

protocol<> 비어있는 protocol composition type이며 모든 type들이 protocol<>에 따르고 있다.


Metatype Type

class type 의 metatype 은 접미사로 .Type을 Protocol 의 metatype은 접미사로 .Protocol을 붙인다.

ex) SomeClass.Type , SomeProtocol.Protocol

.self 를 접미사로 붙이면 인스턴스가 아니라 type 자체를 return 한다. SomeClass.self 을 하는 경우 SomeClass의 인스턴스가 아니라 SomeClass 자체를 리턴한다. .dynamicType 은 인스턴스를 return한다.


Type Inheritance Clause

상속에 관한 내용이다. type 상속은 colon(:)과 함께 시작된다. type identifiers 사이에 comma(,)로 구분한다. 

Class type은 하나의 다른 superclass로 부터 상속받고 0개 이상의 protocol을 구현할 수 있다. 선언 중에는 superclass 의 name이 가장 먼저 와야 하며 뒤에 protocols 이 온다. 만약 다른 class로 부터 상속받지 않는다면 대신 protocol로 시작하게 된다.

class SomeClass: SomeSuperclass, FirstProtocol, AnotherProtocol {} class SomeClass: FirstProtocol, AnotherProtocol {}

다른 named type들도 상속받거나 protocols들을 구현했을 것이다. protocol type은 다른 protocols로 부터 상속받았을 것이다. 


Type Inference

type을 생략할 경우 Swift는 타입 추론을 사용한다. 예를 들어 var x: Int = 0 을 쓰는대신 type을 생략하여 var x = 0 을 쓸수 있다. 컴파일러는 정확히 x의 값이 Int라고 추론한다.  비슷하게 모든 타입이 다 추론 가능할때 type을 생략할 수 있다. 예를 들어 let dict: Dictionary = ["A":1] 은 Dictionary<String, Int>로 추론한다. 하지만.. let dict : Dictionary = ["A":1, 2:"B"] 는 <String, Int> 와 <Int, String>이 같이 사용되어 추론할 수 없어 컴파일 오류가 발생한다.

type 에 대한 정보는 expression tree 잎에서서 root 로 전달된다. var x: Int = 0 을 예로 들면 먼저 0의 type을 추론하고 이 정보를 root로 전달하게 된다. (변수 x로..)

type 정보가 반대 방향으로 전달 되는 경우도 있다. root 에서 잎(leaves)로... 예를 들면...

  • let e = 2.71828 // The type of e is inferred to be Double.
  • let eFloat: Float = 2.71828 // The type of eFloat is Float.

e는 기본적으로 leaves -> root 방향을 따라 2.71828 type인 double로 결정된다. 

eFloat 는 2.71828이 double이지만 Float으로 지정된다.


iOS Developer Library - The Swift Programming Language - Language Reference - Types

신고
Posted by 초프(초보 프로그래머)
Programming/iOS2014.06.11 03:01

Android에 이어 iOS에서도 테스트했습니다.

Crashlytics Plugin을 실행합니다.



DISTRIBUTIONS 탭에 Archive 목록이 보입니다. 원하는 버전에 해당하는 Distribute 버튼을 누르세요.


테스터를 초대하세요.

릴리즈 노트를 작성하세요.



배포가 완료되었습니다.

테스터입장에서 받아보겠습니다.



모바일 디바이스에서 'Let Me In'을 누르면 Beta앱 설치가 진행됩니다.

기본 브라우져가 Safari가 아니면 아래와 같은 화면을 보게 됩니다.

나와 있는데로 길게 눌러서 URL을 복사하고 Safari로 가서 붙여넣으세요.



가이드에 따라 클릭하다보면 설치가 완료됩니다.



Install 을 누르면 앱이 설치되고 테스터의 상태가 변경됩니다.



iOS도 배포및 테스트 편하게 하세요~


2014/06/11 - [Programming/Android] - Crashlytics Beta 기능

신고
Posted by 초프(초보 프로그래머)
Programming/iOS2014.06.03 19:12

플랫디자인으로 네비게이션쪽 작업을 하다 보면 네비게이션과 같은 색상을 사용할때가 있습니다.

이런 경우 아래와 같이 중간에 줄이 생깁니다.

이걸 제거해야... 좀더 이쁘게 보일텐데요.


아래 두줄의 코드를 입력하면 UINavigationBar 밑의 줄이 제거됩니다.

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];



이제 원하는대로 라인이 없어짐!


신고
Posted by 초프(초보 프로그래머)
TAG ios
Programming/iOS2014.05.08 00:09

podspec을 이용하여 라이브러리를 만들때가 있습니다.

dependency를 추가할때 cocoapods에 있는 library면 쉽게 추가가 가능하다. 

하지만 *.framework 파일을 추가하려고 하니 cocoapods 사이트에서도 정보를 찾기 어렵습니다.


해결방법은 vendored_frameworks를 이용하는 것입니다.

spec.vendored_frameworks = 'Framework/KakaoOpenSDK.framework'


pod install 후 확인해 보면 잘 설정되어 있음을 확인할 수 있습니다.


신고
Posted by 초프(초보 프로그래머)
Programming/iOS2014.02.08 02:43

카카오SDK 를 적용할때 plist URL types에 Scheme을 추가해야 합니다.

기존에 다른 URL Scheme이 있는 경우 가장 밑에 카카오 Scheme이 추가됩니다.

이 상태에서 카카오 라이브러리를 호출하게 되면 아래 오류 메세지가 나올 수 있습니다.


"URL scheme for KakaoOpenSDK is not set properly in plist."


분명 plist에 URL Scheme 을 제대로 등록했는데도 이런 오류가 나온다면 plist 파일을 열어 URL types의 순서를 변경해줍니다.

kakao Scheme을 첫번째로 설정하고 실행하면 오류 없이 잘 동작합니다.





신고
Posted by 초프(초보 프로그래머)
Programming/iOS2014.02.06 19:02

회사 개발팀 블로그에 Bots 적용 사례에 대한 글을 올렸습니다.



전체 글은 다음 링크로...

http://bigmatch.i-um.net/2014/02/xcode-bots-%EC%A0%81%EC%9A%A9/


신고
Posted by 초프(초보 프로그래머)
TAG Bot, CI, ios, iphone, Xcode