+ Date

* TimeZone

 날짜정보를 사용하다 보면 날짜를 포멧에 맞춰 출력을 해줘야 하는 경우가 많다.
이때 날짜를 찍어보면 설정한 날짜와 화면에 보이는 날짜나 시간 정보가 몇 시간 빠르게 혹은 느리게 보여지는 경우가 있다.
이는 현재 지역의 타임존과 기본적으로 설정되어 있는 타임존 정보가 틀려발생하는 것 같다.
지금은 시간이 없으니 자세한건 나중에 알아보도록 하자.

자 아래 예를 보자

실제로 설정한 날은 "2017-12-25 00:00:00" 이다.
하지만 print를 보면은 "2017-12-24 15:00:00" 으로 나타난다.
맙소사... 내가 원하는 건 이게 아니다.

원하는 값으로 나오 도록 하려면 타임존을 설정해 주면 된다.
abbreviation을 "UTC"로 해주면 한국 시간과 맞게 나온다.
abbreviation은 여러 타입이 있으니 해외에 거주하는 사람은 해당 지역 타임존 타입을 찾아 보길 바란다.

let locale = NSTimeZone.init(abbreviation: "UTC")

NSTimeZone.default = locale as! TimeZone

자 이제 타임존을 설정해 주고 결과 값을 보자
 

원하는 값이 나왔는가?



'Swift > Swift Basic (3.0Base)' 카테고리의 다른 글

String  (0) 2017.02.17
Tuple (튜플)  (0) 2017.02.10
Closure  (0) 2017.02.10

+ String

- let으로 선언된 문자열은 NSString, var로 선언된 문자열은 NSMutableString과 동일
- String을 var로 선언한 경우에는 다양한 연산자와 메소드를 통해 문자열을 변경할 수 있음, 변경 과정에서 메모리 공간이 부족해지면 변경된 문자열을 모두 저장할 수 있는 새로운 메모리 공간을 할당, Exponential growth 전략이라고도 함, 새로운 메모리 공간을 할당할 때마다 이전보다 두 배 이상 큰공간을 할당, 이러한 작업은 성능에 영향을 줌
- Objective-C와 Swift 모두 사용할 수 있는 NSString과 달리 String은 Swift에서만 사용

* 문자열 생성

- let str = ""     //공백문자열
- let str = String()     //공백문자열
- let str = "Swift String"
- let str = String(stringLiteral: "Swift String")
- let str = NSString(string: "Swift String")

* 문자 생성

- 문자열과 리터럴 표형 방식 동일
- 문자를 생성할 때 반드시 Character 자료형을 명시적으로 지정해야 함
- let ch: Character = "A"
- let ch: Character = "AA"     //Error - Character 지정 후 두 개 이상의 문자를 포함하고 있어 에러
- let ch = Character("A")
- let ch: Character = " "     //하나의 공백 문자
- let ch = Character (" ")     //하나의 공백 문자

* 문자열 길이 확인

- NSString으로 선언하였을 경우

let str: NSString = "Swift String"

print(str. length)

- String 문자열 길이를 확인할 때는 가장 범용적인 characters 속성을 통해 얻을 수 있음

let str = "Swift"

print(str.characters.count)


- String 문자열은 isEmpty 속성으로 비어있는 문자열을 확인 할 수 있음

let str = "Swift"

if  str.isEmpty {

    //........

}


* 문자열 비교

let aString: NSString = "Apple"

let bString = "Orange"

let cString = "apple"


- isEqual (대소문자 구분함)

if aString.isEqual(to: bString) {

    print("Equal")

} else {

    print{"not Equal")

}

// not Equal


- compare (대소문자 구분, 리턴형이 NSComparisonResult, 사전 정렬 순서를 표현 가능(코드값 기준))

let result = aString.compare(bString)

switch result {

case .orderedAscending :

    print("ASC")

case .orderedSame :

    print("SAME")

case .orderedDescending :

    print("DESC")

}


- caseInsensitiveCompare (대소문자 구분하지 않음)

if (aString.caseInsensitiveCompare(bString) == ComparisonResult.orderedSame) {

    print("Equal")

} else {

    print("not Equal")

}


- ==, != 연산자를 통하여 비교할 수 있음

- <, <=, >, >= 연산자가 compare 메소드를 대신하여 사용 할 수 있음

if aString == bString {

    //...

} else if aString < cString {

    //...

} else {

    //....

}


* 문자열 다양한 범위 비교 대상 지정

- compare(_:options:range)

' 비교범위를 Range<Index> 형태로 전달

' options 파라미터에는 빈옵션을 전달 시 0 대신 []을 전달, Swift에서 빈옵션은 []로 나타냄

let compStringA = "Swift 3.0"

let compStringB = "Swift"


var result = compStringA.compare(compStringB)

print(result.rawValue)


let compareRange = compStringB.startIndex ..< compStringB.endIndex

result = compStringA.compare(compStringB, options: [], range: compareRange)

print(result.rawValue)


- hasPrefix, hasSuffic

' 접두어와 접미어를 비교

' 대소문자를 구분, 대소문자 구분이 필요하지 않은 시 compare(_:options:range) 메소드를 NSStringCompareOptions.CaseInsensitiveSearch 옵션과 함께 사용해야 함

let hasString = "Swift"

if hasString.hasPrefix("Swi") {

    print("ok")

}

if hasString.hasSuffix("Programming") {

    print("ok")

}

let compareHasRange = hasString.startIndex ..< hasString.index(hasString.startIndex, offsetBy: 4)

let hasResult = hasString.compare("swi", options: [.caseInsensitive], range: compareHasRange)

print(hasResult.rawValue)


* 문자열 연결

- NSString 자료형 명시

let str1: NSString = "Swift"

let str2 = str1.appending(" Programming")

print(str2)

let str3 = str1.appendingFormat(" %.1f %@", 3.0, "Programming")

print(str3)


- NSMutableString 자료형 명시

let strMS = NSMutableString(string: "Swift")

strMS.append(" Programming")

print(strMS)

strMS.setString("Swift")

strMS.appendFormat(" %.1f %@", 3.0, "Programming")


- String 문자열

' 메소드를 사용하지 않음

' +, += 연산자를 활용하여 두 문자열을 연결

let strString = "Swift" + " Programming"

print(strString)


var strVar = "Swift"

strVar += " Programming"

print(strVar)


' String Interpolation

let version = 3.0

let strSI = "Swift \(version) Programming"

print(strSI)


' String 문자열을 var로 선언하면 NSMutableString에서 제공하는 유사한 메소드를 사용할 수 있음 (append(_:)문자를 appending(_:)는 문자열을 연결할 때 사용, 그 외 appendingFormat(_:)도 존재)

var strAppend = "Swift"

strAppend.append("!")

print(strAppend)

strAppend.appending(" Programming")

print(strAppend)




문자관련해서는 봐야할 것도 많고 자주 사용않으면 잊어버리게 되니 자주 찾아 보게 될거 같다.

인덱싱이나 추출 등은 차 후 업데이트 하도록 하겠다.


Todo...







'Swift > Swift Basic (3.0Base)' 카테고리의 다른 글

Date  (0) 2017.02.17
Tuple (튜플)  (0) 2017.02.10
Closure  (0) 2017.02.10

+ Tuple (튜플)

* 구조체와 유사한 특징

- 멤버에 접근할 때 점 문법을 사용

- 원한는 만큼 멤버를 추가할 수 있음

* 구조체와 상반되는 특징

- 튜플은 선언 없이 사용 가능

- 튜플은 패턴 매칭을 지원

- 구조체는 let, var 키워드를 통해 멤버의 가변성을 지정할 수 있지만 튜플은 불가능

- 튜플은 생성자와 메소를 구현할 수 없음

- 튜플은 프로토콜을 채용할 수 없음

- 튜플은  인덱스를 통해 익명 멤버에 접근할 수 있음


Todo......

'Swift > Swift Basic (3.0Base)' 카테고리의 다른 글

Date  (0) 2017.02.17
String  (0) 2017.02.17
Closure  (0) 2017.02.10

+ Closure

- Swift 클로저는 세 가지 형태를 가지고 있음

1. 기본적인 형태
{ (파라미터 목록) -> 리턴형 in 실행할 코드 } or  { 실행할 코드 }

예1 

let simpleClosure = { (str: String) -> String in

    return "Hello, \(str)"

}


let result = simpleClosure("Swift Closure")

print(result)


예2 ) 

let simpleClosure = { print("Hello, Swift") }


simpleClosure()



- 클로저를 파라미터로 받는 함수

fun performClosure ( _ co: (String) -> (String) ) {

let result = co("Swift Closure")

print(result)

}


호출1 : 변수나 상수 전달

performClosure( simpleClosure )

호출2 : 인라인 클로저

performClosure( { (str: String) -> (String) in

    return "Hello2, \(str)"

} )



- 인라인 클로저의 경우 파라미터와 리턴형 추론 가능

예)

performClosure( { str in

    return "Hello3, \(str)"

})


- 암시적 리턴 (return 키워드 생략 가능, 인라인 클로저가 하나의 return명령문으로 구현되어있을 때만)

예)

performClosure( { str in

    "Hello4, \(str)"

})


- 클로저 내부에서 사용할 수 있는 축약된 인자이름 제공, 첫 번째 인자의 이름은 $0, 두 번째 인자의 이름은 $1 ..., 축약된 인자 이름 사용 시 파라미터 이름과 in 키워드를 생략가능

예 )

performClosure( { "Hello5, \($0)" })


2. 연산자 함수

- 클로저가 두 개의 파라미터를 비교한 후 결과를  Bool로 리턴한다면 인라인 클로저를 연산자 함수로 태체가능.

예1 ) 컬렉션을 정렬할 때 사용하는 sort 함수를 구현

let numbers = [1, 7, 23, 5, 8, 3, 6]

let orderedNumbers = numbers.sorted(by: { (lhs: Int, rhs: Int) in

    return lhs < rhs

} )


예2 ) 연산자 함수로 대체

let orderedNumbers2 = numbers.sorted(by: <)


3. Trailing Closure

- 인라인 클로저는 함수 호출 구문에 포함되는 형태이므로 클로저의 구현 부분이 단순한 경우에 적합

- 클로저의 구현이 복잡한 경우에는 트레일리 클로저로 구현하는 것이 좋음

- 인라인 클로저와 트레일링 클로저의 가장 큰 차이는 클로저가 포함되는 위치

1. 인라인 클로저는 함수 호출 시 사용하는 괄호 내부에 위치

예 ) 

performClosure( {( "Hello InlineClosure, \($0)")} )

2. 트레일링 클로저는 괄호 이후에 위치

예 )

performClosure() { "Hello TrailingClosure, \($0)" }


- 클로저가 함수의 마지막 파라미터로 전달되는 경우에만 사용가능

- 함수 이름 다음에 바로 {}가 온다면 이 함수는 하나의 파라미터를 가지고 있고, 트레일링 클로저라는 것을 직관적으로 유추할 수 있어야함 (함수와 혼동 할 수도 있기 때문)


- Swift 클로저는 외부에 선언되어 있는 변수를 클로저에 선언되는 시점에 변수의 참조가 클로저 내부로 전달되어 클로저 내부 또는 외부에서 값을 변경할 경우 동일한 값으로 변경됨


'Swift > Swift Basic (3.0Base)' 카테고리의 다른 글

Date  (0) 2017.02.17
String  (0) 2017.02.17
Tuple (튜플)  (0) 2017.02.10

+ Recent posts