[Swift 문법] 문자열과 문자

!·2022년 7월 27일
0

Swift 문법

목록 보기
18/27

문자열과 문자

  • String 타입은 Foundation 프레임워의 NSString이 bridge된 형식이다.
  • 문자열은 정수형 인덱스(ex. string[2])와 같이 접근할 수 없다!
  • 문자 배열을 이용해 문자열의 초기화 메소드(String())에 넣어 문자열을 생성할 수 있다.
let carray : [Character] = {"a","b","c","d"};
let string = String(caaray)
  • 문자열과 문자의 결합은 += 연산자 혹은 append() 메소드를 통해 할 수 있다.
  • 문자열은 값 참조 형식으로, 메소드를 통해 변경해도 원본은 변하지 않는다.

프로퍼티 및 메소드

문자열 요소에 접근하기 위해서는 일반적으로 subscript 를 사용한다. 다른 프로그래밍 언어같은 경우에는 []내부에 인덱스(정수)를 넣어 문자를 추출하지만 스위프트는 []내부에 String.Index 타입의 값을 넣어줘야한다.

  • 인덱스 구하기
    startIndex : 문자열의 첫번째 문자에 해당하는 String.Index 타입의 값 반환
    endIndex : 문자열의 마지막 문자 다음에 해당하는 String.Index 타입의 값 반환
    index(of: Character) : 최초 등장하는 해당 문자의 String.I ndex 값 반환
    index(before:String.Index) : String.Index 값 이전의 문자에 해당하는 Stirng.Index 타입의 값 반환
    index(after:String.Index) : String.Index 값 다음의 문자에 해당하는 String.Index 타입의 값 반환
    index(String.Index, offsetBy: String.IndexDistance) : String.Index로 부터 정수값 만큼 떨어진 문자에 해당하는 String.Index 타입의 값 반환
    index(of:Charcter): 문자열에 문자가 존재하는 String.Index를 반환
let str = "abcde"
str[str.startIndex]	//	a
str[str.endIndex] 	//	런타임에러
str[str.index(before:endIndex)] // e
str[str.index(stringIndex,offsetBy:2)]	// b

해당 방식으로 문자를 추출하는 방법도 존재하지만 extension 키워드를 이용해 메소드를 구현하는 방법도 존재한다.

extension String{
	func getChar(at index: Int) -> Int{
    	return self[self.index(self.startIndex,offsetBy: index)]
        
let str = "aBcDeF"
str.getChar(2) // c
  • 문자의 삽입과 삭제
    insert(Charcter,at:String.Index) : 문자열에 특정 문자를 해당 위치에 삽입
    insert(contentsOf:String, at:String.Index) : 문자열에 특정 문자열을 해당 위치에 삽입
    remove(at:String.Index) : 문자열의 해당 위치에 문자를 삭제
    removeSubrange(range) : 문자열의 지정한 범위의 문자열을 삭제
var str = "Hello World!"
str.insert("!", at: str.endIndex) // Hello World!
print(str)
str.insert(contentsOf:" Lee!",at: str.endIndex) // Hello World! Lee!
print(str)
str.remove(at: str.index(str.startIndex, offsetBy: 3)) // Helo World! Lee!
print(str)
let stringRange = str.index(str.startIndex, offsetBy:4)..<(str.endIndex)
str.removeSubrange(stringRange) // Helo World!! Lee!

부분 문자열

문자열에서 prefix(_:) 와 같은 메소드를 사용해 부분문자열을 추출해낼 수 있다. 하지만, 해당 메소드를 통해 나온 문자열은 String 데이터 타입이 아닌 SubString 데이터 타입이다.
그림을 본다면 SubString 데이터 타입은 String 타입의 인스턴스를 참조하는 형식으로 되어 있다. 이는 SubString 인스턴스가 존재한다면 Stirng 인스턴스도 존재해야만 하는 것을 의미하기떄문에 SubString 인스턴스는 String 타입으로 형변환 하는 것이 바람직하다.

let greeting = "hello, world"
let index = greeting.index(of:",") ?? greeting.endIndex // a ?? b -> a가 nil이 아니라면 a, 맞다면 b
let beginning = greeting[...<index] // 범위 연산자와, String.Index를 통한 부분 문자열 추출(SubString) 형

greeting.prefix(4) // hell
greeting.suffix(4) // orld

접두사와 접미어 비교를 통해 문자열을 처리할 수도 있다.

let stringArray = ["aaabbb","aabb","aaaab","aaabbba"]
for string in stringArray{
	if(string.hasPrefix("aa")
    	print(string)
 	if(string,.hasSuffix("bb")
    	print(string)
}
profile
개발자 지망생

0개의 댓글