본문 바로가기
iOS/swift

String

by 패쓰킴 2022. 9. 22.
728x90

특정 문자 제거

  • 양끝 문자 제거

중간에 있는 문자는 제거 불가능

var helloStr = "Hello!"
var iosStr = "#iOS"
var swiftStr = "#Swift!"

helloStr.trimmingCharacters(in: ["!"])//Hello
iosStr.trimmingCharacters(in: ["#"])//iOS
swiftStr.trimmingCharacters(in: ["#","!"])//Swift
  • 중간에 있는 문자 제거
    var str = "Hello~!@@@, Swift Zedd"
    str.components(separatedBy: ["~","!","@",",","Swift"])//error!!
  • var str = "Hello~!@@@, Zedd" str.components(separatedBy: ["~","!","@",","]).joined() //Hello Zedd //separatedBy에는 String이 들어갈 수 없다. character만 들어가야함
  • 특정 문자(character) 제거
  • var str = "Hello~!@@@, Zedd" str.components(separatedBy: ["~","!","@",","]).joined() //Hello Zedd
  • 끝에 있는 문자 제거
  • let a = "123456" a.dropLast(1) // "12345"
  • trim 이용하기

trim?

문자열 앞뒤의 공백을 제거한 새로운 문자열을 리턴 해주는 함수. 문자열 중간에 있는 공백은 제거되지 않는다.

//앞뒤 공백이 제거된 AfterTrim 문자열을 구할 수 있습니다.
let beforeTrim = " a b "
let AfterTrim = beforeTrim.trimmingCharacters(in: 
                                 .whitespacesAndNewlines) // "a b"

/*공백이 제거된 문자열에 isEmpty 함수를 사용하면, 유저로부터 입력받은 값의
공백체크를 하기 좋습니다.*/
let beforeTrim = "  "
let beforeIsEmpty = beforeTrim.isEmpty // false
let beforeLength = NSString(string: beforeTrim).length // 2
let afterTrim = beforeTrim.trimmingCharacters(in: 
                                          .whitespacesAndNewlines)
let afterIsEmpty = afterTrim.isEmpty // true
let afterLength = NSString(string: afterTrim).length // 0

//입력받은 문자열에서 괄호 지우기 -> "x,y"
    func removeParenthesis(_ input: String) -> String {
        var inputs = input
        if inputs.contains("(") && inputs.contains(")") {
            inputs = inputs.replacingOccurrences(of: "(", with: "")
            inputs = inputs.replacingOccurrences(of: ")", with: "")
        }
        return inputs
    }

//입력값에서 숫자만 가져오기
func makeNumericArrayBy(rawInput: String) -> [Int?] {
    let pointElements = rawInput.components(separatedBy:CharacterSet
(charactersIn: "-,")).map { $0.trimmingCharacters(in: CharacterSet
(charactersIn: "()")) }
    let numericElements = pointElements.map {Int($0)}
    return numericElements
}
print(makeNumericArrayBy(rawInput: "(10,10)-(3,3)"))
//[Optional(10), Optional(10), Optional(3), Optional(3)]
  • 상단 코드 해석하기
    1. components(separatedBy: CharacterSet) → [String]
    2. : characterSet을 이용해 string을 나눠서 문자열 배열을 리턴
    3. map { $0 } : 배열의 0번째
    4. trimmingCharacters(in set: CharacterSet) → String
    5. : charactersIn에 주어진 character를 string에서 제거하여 새로운 string 리턴
  • let pointElements = rawInput.components(separatedBy:CharacterSet (charactersIn: "-,")).map { $0.trimmingCharacters(in: CharacterSet(charactersIn: "()")) } //["10", "10", "3", "3"]

문자 쪼개기

let str = "1 2 "
let strArr = str.split(separator: " ")
// strArr["1","2"]
let str = "1 2 "
let strArr = str.components(separatedBy: " ")
// strArr["1","2",""]
let str = "123"
for i in str.indices {
  print(str[i])
}
// 1
// 2
// 3

문자열에서 숫자만 가져와 배열만들기

let str = “123abc45”
let num = str.components(separatedBy: CharacterSet.decimalDigits.inverted)
// num = [“123”,”45”]

< 참고 사이트 >

https://zeddios.tistory.com/74

https://hcn1519.github.io/articles/2017-07/swift_Str

문자 쪼개서 배열에 넣기

let str = "ab"
let arr = str.map{$0} // ["a","b"]

let str2 = ["ab","cd"]
let arr2 = str2.map{$0.map{$0}} // [["a","b"],["c","d"]]

let str3 = "ab"
let arr3 = Array(str3) // ["a","b"]

Formatter

date를 내가 원하는 형태로 리턴 받을 수 있도록 해준다

  • Date -> String
let dateFormatter: DateFormatter = {
  let format = DateFormatter()
  format.dateStyle = .medium // 날짜를 보여줄 스타일
  format.timeStyle = .medium // 시간을 보여줄 스타일

  // 또는 커스텀 형식 >>
  format.dateFormat = "yyyy/MM/dd hh:mm"
}
  • String -> Date String 날짜와 변환할 때 포맷이 똑같아야 한다.
let dateFormat = DateFormatter()
dateFormat.dateFormat = "yyyy/MM/dd hh:mm"
dateFormat.timeZone = NSTimeZone(name:"UTC") as TimeZone?

let date = dateFormat.date(from: stringDate)!
Pattern Result (in a particular locale)
yyyy.MM.dd G 'at' HH:mm:ss zzz 1996.07.10 AD at 15:08:56 PDT
EEE, MMM d, ''yy Wed, July 10, '96
h:mm a 12:08 PM
hh 'o''clock' a, zzzz 12 o'clock PM, Pacific Daylight Time
K:mm a, z 0:00 PM, PST
yyyyy.MMMM.dd GGG hh:mm aaa 01996.July.10 AD 12:08 PM
  1. 숫자"%02d" : 0 - 앞에 0을 붙여준다 / 2 - 2개의 문자 / d - decimal 숫자로
  2. String(format:"%02d",문자로 바꿀 변수명)
  3. 문자인 숫자의 셋째자리 콤마
  4. func decimalNumber(value: Int) -> String{ let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal guard let result = numberFormatter.string(from: NSNumber(value: value)) else { return "" } return result }

특정 위치의 문자 찾기

let str = "KRW(₩원화)"

let range1 = str.index(str.startIndex, offsetBy: 0) ... str.index(str.startIndex, offsetBy: 2)
let range2 = String(str.prefix(3))

// range1: KRW
// range2: KRW

index(_:offsetBy) -> String

Prefix(_:) -> ArraySlice

특정 문자의 위치 찾기

let str = "hello"
var idx = 0

if let range = str.range(of:"e") {
  idx = str.distance(from: str.startIndex, to: range.lowerBound) // idx = 1
}

range = str에서 "e"를 찾기 위한 시작값부터 끝값까지의 값

.lowerBound = range의 시작값

++ str.range(of:"e", options: .backwards)라고 옵션을 넣어주면 뒤에서 부터 검색

(1...10).lowerBound // 1  시작값
(1...10).upperBound // 10 끝값
(1...10).count      // 10
(1...10).isEmpty    // false

 

문자 잘라내기

특정 위치에서부터 끝까지 자르기

let str = "abcdefg" 
// 첫번째 방법
let idx = str.index(str.startIndex, offsetBy: 3)
let result = String(str[idx...]) // defg 
// 두번째 방법 
let findIdx:String.Index = str.firstIndex(of: "d")!
let result = str[findIdx...] // defg

 

처음부터 특정 위치까지 자르기

let str = "abcdefg" 
let idx = str.index(str.startIndex, offsetBy: 3) 
let result = String(str[...idx]) //abcd

 

앞에서 몇 개, 뒤에서 몇 개만 자르기

let str = "abcdefg" 
let pre = str.prefix(3) // 앞에서 3개
//abc 
let suf = str.suffix(3) // 뒤에서 3개 
// efg

 

첫번째 문자만 가져오기

let string = "hello"
let first = string.removeFirst() // h

 

문자열 뒤집기

let str = "hello"
let reversed = String(str.reversed())
// olleh

 

특정 문자의 위치 부터 끝까지

let index = script.firstIndex(of: "\n") ?? script.startIndex
let text = (script[index...]).replacingOccurrences(of: "\n", with: "")
let range = (script as NSString).range(of: String(text))

 

특정 위치부터 끝까지

let str = "Programmer1234"
let suffixString = str.suffix(11)
// grammer1234

 

문자열 for문 돌리기

extension String {
    subscript(index: Int) -> Character {
        return self[String.Index(utf16Offset: index, in: self)]
    }
}

출처 : https://jeong9216.tistory.com/556

 

ASCII

img

  • Unicode -> Int(UInt32) 
  •  
  • let value = "abcDEF" for index in value.utf16 { print(index) // 97,98,99 ~ } var char = "A" UnicodeScalar(char)?.value // 65
  • Int(UInt32) to Unicode
let num = 97 
if let num = UnicodeScalar(num) {
    print(num) // a 
}
  • UInt32 to Int
let ascii = UnicodeScalar(char)?.value
let number = Int(truncating: ascii as! NSNumber)
  • ascii 와 string 조합하여 사용하기
var ascii = Int(UnicodeScalar("a")!.value)
var str = String(UnicodeScalar(ascii)!)

 

참고 :

https://shaeod.tistory.com/228

https://zeddios.tistory.com/340

https://stackoverflow.com/questions/61090503/initializer-init-requires-that-decimal-conform-to-binaryinteger

 

NSMutableAttributedString

String에 문자 외 다른 타입을 삽입 할 수 있도록 해주는 클래스 ex. 문자에 이미지 삽입

let attributedString = NSMutableAttributedString(string: "")
let attachment = NSTextAttachment()
let image = UIImage(named: "image.jpg")

attachment.image = image
attachment.bounds = CGRect(x:0, y:0, width:100, height:100) // 이미지의 위치와 사이즈 지정
attributedString.append(NSAttributedString(attachment: attachment))
textField.attributedText = attributedString
728x90

'iOS > swift ' 카테고리의 다른 글

숫자 다루기  (1) 2023.11.07
attributedString  (0) 2022.12.26
Array  (0) 2022.12.21
진법 변환  (0) 2022.08.31
Alamofire timeout set(Swift5)  (0) 2022.08.25

댓글