+ Date
* TimeZone
let locale = NSTimeZone.init(abbreviation: "UTC")
'Swift > Swift Basic (3.0Base)' 카테고리의 다른 글
String (0) | 2017.02.17 |
---|---|
Tuple (튜플) (0) | 2017.02.10 |
Closure (0) | 2017.02.10 |
let locale = NSTimeZone.init(abbreviation: "UTC")
String (0) | 2017.02.17 |
---|---|
Tuple (튜플) (0) | 2017.02.10 |
Closure (0) | 2017.02.10 |
let str: NSString = "Swift String"
- 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...
Date (0) | 2017.02.17 |
---|---|
Tuple (튜플) (0) | 2017.02.10 |
Closure (0) | 2017.02.10 |
* 구조체와 유사한 특징
- 멤버에 접근할 때 점 문법을 사용
- 원한는 만큼 멤버를 추가할 수 있음
* 구조체와 상반되는 특징
- 튜플은 선언 없이 사용 가능
- 튜플은 패턴 매칭을 지원
- 구조체는 let, var 키워드를 통해 멤버의 가변성을 지정할 수 있지만 튜플은 불가능
- 튜플은 생성자와 메소를 구현할 수 없음
- 튜플은 프로토콜을 채용할 수 없음
- 튜플은 인덱스를 통해 익명 멤버에 접근할 수 있음
Todo......
Date (0) | 2017.02.17 |
---|---|
String (0) | 2017.02.17 |
Closure (0) | 2017.02.10 |
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 클로저는 외부에 선언되어 있는 변수를 클로저에 선언되는 시점에 변수의 참조가 클로저 내부로 전달되어 클로저 내부 또는 외부에서 값을 변경할 경우 동일한 값으로 변경됨
Date (0) | 2017.02.17 |
---|---|
String (0) | 2017.02.17 |
Tuple (튜플) (0) | 2017.02.10 |