콘텐츠로 건너뛰기
Home » swift » Page 15

swift

Swift – 문자열 자르기

문자열을 쪼개기

Swift 4에서의 변경

Swift 4에서 문자열은 그 자체로 시퀀스이고, 서브시퀀스에 접근하기 위해 characters 속성을 사용하지 않게 되었다. (characters 속성 자체가 제거되었다.). split(separator:)를 사용해서 문자열을 자른 결과는 Array<Substring> 타입으로 반환된다. Substring 타입 역시 StringProtocol을 따르고 있기 때문에, 다시 join(separator:)로 묶은 경우 최종 결과는 String이 될 수 있다.

let a = "12,34,56,78"
let xs = a.split(separator:",")
let b = xs.joined(separator:"+")
print(b)
// 12+34+56+78

참고로 split(separator:)에는 빈 문자열을 구분자로 넣을 수 없다. (구분자의 타입은 Character이다.) 따라서 개별 글자로 쪼개진 배열을 얻고 싶다면, unicodeScalars 프로퍼티를 이용한다. (이 스칼라 코드값을 사용하면 Character나 String을 만들 수 있다.)

let ys = a.unicodeScalars.map(String.init)
// ["1", "2", ",", "3", ... ]

Swift3 버전을 중심으로 업데이트.

Swift 문자열은 Collection 타입이 아니기때문에 문자열을 쪼개는 작업은 characters 속성을 이용해야 하는 것은 Swift2와 동일하다. 다만 API의 이름 변경 정책에 따라서 split(_:) 함수가 split(separator:)로 바뀌었다는 것 정도가 차이점이다.

let a = "12,34,56,78"
let xs = a.characters.split(separator:",").map{ String($0) }
let b = xs.joined(separator:"+")
print(b)
//12+34+56+78

  Swift 2.0 버전으로 업데이트 (2015-08-19)

기본적으로 Swift의 String 타입은 Foundation을 임포트하게되면 NSString과 거의 같은 API를 제공하기 때문에 아래와 같이   -componentsSeparatedByString: (Swift3에서는 components(separatedBy:)메소드를 써서 문자열을 분해할 수 있다.

let string = "Fizz Buzz Fizz Buzz FizzBuzz"
let separated = string.componentsSeparatedByString(" ")

하지만 이렇게 해서 얻은 결과는 [AnyObject] 이다. 만약 우리가 얻고자 하는 결과가 [String] 타입이라면 이를 다시 맵핑해야 한다. Foundation이 제공하는 API를 통해 잘라낸 배열은 [String] 타입이다.

더 보기 »Swift – 문자열 자르기

UnicodeScalar

UnicodeScalar 유니코드 문자 1개에 해당하는 코드 포인트값을 담고 있는 데이터이다. UnicodeScalar는 4바이트 유니코드 값 1개에 대응되기 때문에 UInt32 타입으로 변환하거나, UInt32값으로부터 생성해낼 수 있다. let i:Uint32 = 0xac01 let c = UnicodeScalar(i) print(c) let v:UInt32 = c.value Swift의 Character 타입은 글자 1개를 나타내는 자료형이지만, 유니코드 문자 중에서는 여러 개의 코드 값이 하나로 합쳐진 글자들이 있기 때문에 1개의 Character 타입 값은 1개 혹은 그 이상의 UnicodeScalar 값으로 표현된다. 예를 들어 한글 "학"은 1개의 글자로 그 자체로 유니코드 코드포인트 값 1개에 대응될… 더 보기 »UnicodeScalar

클로져 사용방법(Swift)

클로저 사용 시 인자 전달방법

함수의 인자로 클로저를 전달하는 경우를 생각해보자. 배열의 정렬된 사본을 만드는 sorted(_:,_:)의 경우 대략 다음과 같은 시그니처를 가지고 있다.

func sorted<C: SequenceType>(source: C, isOrderedBefore: (C.Geneartor.Element, C.Generator.Element) -> Bool) -> [C.Generator.Element]

만약 정수 배열을 정렬한다고하면 다음과 같이 사용한다.

let arr = [5, 8, 2, 4, 2, 1, 7]
let sortedArr = sorted(arr, { (x:Int, y:Int) -> Bool  in
    return x < y
})

이 때 함수의 마지막 인자는 trailing closure라고 해서 괄호 밖으로 빼낼 수 있다.

let sortedArr = sorted(arr){ (x:Int, y:Int) -> Bool in return x < y }

이때 클로저가 받는 각 인자는 순서대로 $0, $1, … 로 명명하는 것이 가능하다. 이 표현방식도 많이 알려져있는 형태이다. 더 보기 »클로져 사용방법(Swift)

오일러 프로젝트 009

둘레의 길이가 1000이고 각 변의 길이가 자연수인 직각삼각형 찾기 세 자연수 a, b, c 가 피타고라스 정리 를 만족하면 피타고라스 수라고 부릅니다 (여기서 ). 예를 들면 이므로 3, 4, 5는 피타고라스 수입니다. a + b + c = 1000 인 피타고라스 수 a, b, c는 한 가지 뿐입니다. 이 때, a × b × c 는 얼마입니까? 삼각형의 세 변의 길이를 짧은 것 부터 a, b, c 라하자. ( ) 이 때 a 가 가장 커질 수 있는 경우는 ,… 더 보기 »오일러 프로젝트 009

guard 문법(Swift 2.0)

guard

Swift 2.0에서 새로운 guard 문이 추가되었다. 이는 특정 조건을 만족하지 않을 때 지정한 블럭을 수행하는 것이며, 따라서 필연적으로 else 를 써야 한다. 기본적인 문법은 다음과 같다.

guard x > 0 else { return }

이 문법은 사실 본질적으로더 보기 »guard 문법(Swift 2.0)

오일러 프로젝트 08

접근 리스트 내 임의의 위치에서부터 연속한 5개의 값을 얻고, 이 수들의 누적곱을 구할 수 있으면, 0부터 955 사이의 위치에 대해 이 계산을 적용한 후 최대값을 구하면 된다. 리스트를 xs라 하고, 특정한 위치 pos에서 다섯 개의 연속한 원소를 구하기 위해서는 슬라이싱 문법을 사용할 수 있다. 누적곱은 루프를 돌면서 곱해도 되고, reduce() 함수를 사용해서 리스트를 접어서 만들수도 있다.

문자열의 부분집합(Swift)

문자열의 부분집합 구하기 Swift3으로 업데이트 (2016-07-04) 인덱스타입(Index)은 특정한 집합 내에서의 위치를 가리키기 때문에 다음번 인덱스의 위치를 계산하기 위해서는 원래의 문자집합을 알고 있어야 한다. 따라서 advance() 메소드는 상당히 부담스러우므로, 성능 개선을 위해서 이는 문자열에서 특정 인덱스의 오프셋 이동을 하는 메소드를 사용하도록 바뀌었다. String.index(_:offset:) Range 타입의 양끝은 startIndex, endIndex가 아닌 lowerBound, upperBound가 되었다. 따라서 서브스크립션 확장은 다음과 같이 재작성 된다. extension String { subscript(r: Range<Int>) -> String { let a = self.index(startIndex, offsetBy: r.lowerBound) let b = self.index(startIndex, offsetBy: r.upperBound) return self[a..<b]… 더 보기 »문자열의 부분집합(Swift)

오일러 프로젝트 07

소수를 크기 순으로 나열하면 2, 3, 5, 7, 11, 13, … 과 같이 됩니다. 이 때 10,001번째의 소수를 구하세요.(http://euler.synap.co.kr/prob_detail.php?id=7) 접근 소수판별함수를 만들어볼 차례이다. 사실 이 블로그를 통틀어서 여러 번 소개한 적이 있다. 소수를 판별하기 위해서는 기본적으로 2, 3, … n – 1 까지의 수를 모두 나눠보아야 한다. 하지만 만약 n이 소수가 아니라면 n = p * q 로 표현할 수 있을 것이며, p <= q 라면 2 에서부터 n의 제곱근 사이에 p가 등장해야 한다. 따라서 n의 제곱근 이하에서만 검사를하면 검사… 더 보기 »오일러 프로젝트 07

오일러 프로젝트 06

1부터 10까지 자연수를 각각 제곱해 더하면 다음과 같습니다 (제곱의 합).1^2 + 2^2 + … + 10^2 = 385 1부터 10을 먼저 더한 다음에 그 결과를 제곱하면 다음과 같습니다 (합의 제곱).(1 + 2 + … + 10)^2 = 55^2 = 3025 따라서 1부터 10까지 자연수에 대해 “합의 제곱”과 “제곱의 합” 의 차이는 3025 – 385 = 2640 이 됩니다. 그러면 1부터 100까지 자연수에 대해 “합의 제곱”과 “제곱의 합”의 차이는 얼마입니까? (http://euler.synap.co.kr/prob_detail.php?id=6) 접근 1부터 100까지를 제곱한 수의 합과, 1부터 100까의 합의 제곱의… 더 보기 »오일러 프로젝트 06

오일러 프로젝트 04

앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.
두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.
세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?

더 보기 »오일러 프로젝트 04