ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift 문법 정리(-ing)
    Apple🍎/Swift 2024. 4. 23. 18:57

    숫자

    Float, Double 

    Float은 소수점 이하 6자리만 표현 가능, Double은 15자리까지 가능하다.

    var FloatValue: Float = 1.2345678910
    var DoubleValue: Double = 1.2345678910
     
    print("FloatValue는 : \(FloatValue), Double은 : \(DoubleValue)")
    //FloatVlaue는 : 1.2345679, Double은 : 1.234567891
    //FloatVlaue는 9에서 짤리지만, Double은 모든 소수점을 다 보여준다.
     
    FloatValue = 123.456
     
    print(FloatValue)

    제곱근(sqrt), 제곱(pow) 

    import Foundation 필요

    sqrt(double형) -> return Double

    Float, Double -> Int 반올림, 내림, 올림

    let pi = 3.14
    print(Int(pi))
    
    // float -> Int
    let floatNumber: Float = 3.14
    let ftoi = lroundf(floatNumber)
    
    let doubleNumber: Double = 3.43
    let dtoi = lroundl(doubleNumber)

     

    진법 변환

    • 정수를 이진변환 String(number, radix: 2)
    let number = 42
    let binaryString = String(number, radix: 2)
    print(binaryString) // 출력: "101010"
    • 이진법을 10진수 정수로 변환 Int(binaryString, radix: 2)
    let binaryString = "101010"
    if let number = Int(binaryString, radix: 2) {
        print(number) // 출력: 42
    } else {
        print("Invalid binary string")
    }

     

    정수 -> 이진변환 후 1의 개수 알기 (nonzeroBitCount)

    let num = 4
    n.nonzeroBitCount // 1
    
    String(num, radix:2).filter { $0 == "1" }.count
    보다 훨씬 성능이 빠름

     

    문자열

    문자열 대소문자 바꾸기

    s = "pPoooyY"
    s = s.lowercased() // ppoooyy
    s = s.uppercased() // PPOOOYY

     

    문자열 슬라이싱 (SubString)

    Swift에서의 String의 인덱스에 Int로 받지 않고, String.Index를 사용한다. 

    String.Index : 스위프트에서 문자열의 인덱스를 표현하기 위해 사용하는 특수한 타입

     

    앞, 뒤에서부터 글자 가져오기

    1) s.prefix(n) // 앞에서부터 n글자 가져오기
    2) s[s.startIndex] // startIndex 활용
    3) let idx = String.Index(encodedOffset: 0) //0번째 인덱스를 나타내는 인덱스 생성
    	s[idx]
        
    4) 뒤에서부터 가져오기
    subfix(n) : 뒤에서부터 n글자 가져오기
    let lo = hello.suffix(2)

     

    문자열의 두 번째 글자 구하기

    두 번째 글자를 나타내는 인덱스를 먼저 생성한 뒤, 그 인덱스를 활용해 두 번쨰 글자를 찾는다.

    let secondIndex = hello.index(after: hello.startIndex)
    let second = hello[secondIndex]

     

    문자열의 n번째 이후 모든 글자

    String.index(시작 위치, offsetBy: Int(시작위치로부터 떨어진 위치))

    let s = "12:00:00AM"
    let timeIndex = s.index(s.startIndex, offsetBy: 7)
    let timeStr = String(s[...timeIndex]) // 12:00:00
    let ampmIndex = s.index(s.endIndex, offsetBy: -2)
    let ampmStr = String(s[ampmIndex...]) // AM
    
    // 또는 아래와 같이 구할 수도 있다
    let timeStr2 = s.prefix(8) // 앞에서부터 8개 글자 12:00:00
    let ampmStr2 = s.suffix(2) // 뒤부터 2글자 AM

     3 ~ 10번까지의 문자열 가져오기

    if let input = readLine() {
        let startIndex = input.index(input.startIndex, offsetBy: 2)
        let endIndex = input.index(input.startIndex, offsetBy :9)
        print(input[startIndex...endIndex])
    }

    문자열의 맨 마지막 글자 구하기

    • index를 사용해 구하는 방법: index(before: ) & endIndex 
    • suffix로 item 1개를 가져오는 방법: suffix(1)
    // hello[hello.endIndex] -> 에러.
    
    let endIndex = hello.index(before: hello.endIndex)
    let last = hello[endIndex]
    
    맨 뒤부터 움직이는 offset의 경우 음수로 넣는다. 
    let endIndex = hello.index(hello.endIndex, offsetBy: -1)
    
    let item = hello.suffix(1)

    문자열에서 특정 문자의 인덱스 구하기

    func firstIndex(of: Character) -> String.Index? 또는

    func lastIndex(of: Character) -> String.Index? 를 활용한다.

    예를 들어 o라는 문자의 인덱스를 구하려면 아래와 같이 사용한다.

    • let oIndex = hello.index(of: "o")

    ❗️String.Index 을 구하기 위해 사용한 위의 메서드들은 사실 Substring에서 제공하는 메서드들이다!

    문자열 잘라내기

    스위프트의 substring = 부분문자열 을 의미한다.

    부분문자열은 String.Index를 활용해 범위(range)를 먼저 만들고, 그 범위를 이용해 구한다.

    예를 들어 var hello = "hello" 에서 맨 앞, 맨 뒤 글자를 제외한 ell만 구해 보자.

    let rangeStartIndex = hello.index(after: hello.startIndex)
    let rangeEndIndex = hello.index(hello.index, offsetBy: -2)
    let ellSubstring = hello[rangeStartIndex...rangeEndIndex] // Substring 타입의 "ell" 생성
    
    // 아래 코드는 위의 코드와 같은 역할이다.
    
    let rangeStartIndex = hello.index(after: hello.startIndex)
    let rangeEndIndex = hello.index(before: hello.endIndex)
    let ellSubstring = hello[rangeStartIndex..<rangeEndIndex] // ..< 을 사용함에 주의

    인덱스의 범위를 이용해 얻은 부분문자열은 String이 아닌 Substring이라는 별도의 타입이므로, String으로 캐스팅해 주어야 한다.

    • let ellString = String(ellSubstring)

     

    Ascii 변환

    Int ->String : String(UnicodeScalar(65)!) // "A"
    Stirng-> Int: Int(UnicodeScalar("A").valule) // 65

     

    문자열 숫자/문자인지 확인

    • Character 타입의 확장이다.
      • isLetter: 문자가 알파벳 문자(A-Z, a-z)인지 확인
      • isNumber: 문자가 숫자(0-9)인지 확인
      • isSymbol: 문자가 기호인지 확인
      • isPunctuation: 문자가 문장 부호인지 확인
      • isWhitespace: 문자가 공백 문자인지 확인
    character.isNumber
    letter.isLetter

     

    문자열 교체(replaceOccurences(of: with:)

     var s = s.replacingOccurrences(of: "0", with: "")
     // 1101 -> 111

     

    배열

    배열 선언

    // 빈 배열
    let arrInt: Array<Int> = []
    let arrInt2 = Array<Int>()
    
    // 초기화 한 배열
    let arrBool = [Bool](repeating: false, count: 10) // [false 10개]
    let zeroArray1 = [Int](repeating: 0, count: 10) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    let zeroArray2 = Array(repeating: 0, count: 10) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
    var a = [Int](-5...5) // [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

    배열 기본 함수(추가, 삭제, isEmpty, popLast() )

    // 원소 추가
    arr.append(item)
    
    // 원소 삭제
    arr.remove(at: idx)
    
    arr.isEmpty
    
    arr.popLast() // 마지막 원소 빼면서, 원소 알려줌 -> O(1)

     

    배열의 총 개수 세기 -> count, capacity

    var names = ["Gregory", "Perry", "Nadal"]
    print(names.count)  
    
    var employees = [String]()
    print(employees.count)

     

    배열의 특정 원소 찾기 -> filter, components, split

    • components, split 둘다 쪼개는 것
      • components - separatedBy, return 값: Array<String>
      • split - separator, return 값: Array<Substring>
    array.filter { $0 % 2 == 0 }
    
    /* components */
    import Foundation
    var str = "안녕하세요 split과 components에 대해 알아보아요"
    str.components(separatedBy: " ")
    
    //결과: ["안녕하세요", "split과", "components에", "대해", "알아보아요"]
    
    /* split */
    var str = "안녕하세요 split과 components에 대해 알아보아요"
    str.split(separator: " ")
    
    //결과: ["안녕하세요", "split과", "components에", "대해", "알아보아요"]

     

    배열 최소, 최대값 구하기(min, max)

    var arr = [60,70,80,90,100]
    arr.min() //Optional(60)
    arr.max() //Optional(100)

     

    배열 전체 합 -> reduce

    let numberArray = [1,2,3,4,5,6,7,8,9,10]
    let sum = numberArray.reduce(0, { (first: Int, second: Int) -> Int in
        return first + second
    })
    print(sum)
    // 55
    
    # 매개변수, 반환 타입, 반환 키워드(return) 생략한 후행 클로저
    let numberArray = [1,2,3,4,5,6,7,8,9,10]
    let sum = numberArray.reduce(0) { $0 + $1 }
    print(sum)
    // 55

    Int -> list로 바꾸는 경우

    1) compactMap

    String으로 정수를 문자열로 변환. compactMap으로 문자열 -> 문자 배열로 변환.

    $0은 문자(char)이므로 문자열인 String으로 바꿔준 뒤에, Int형으로 변환해야한다. # swift에선 char -> Int는 지원 X

    let number = 1234
    let array = String(number).compactMap { Int(String($0)) }
    print(array) // 결과: [1, 2, 3, 4]

     

    2) compactMap, wholeNumberValue

    wholeNumberValue: 문자(char)가 의미하는 숫자값을 반환하는 것

    let n = 1234
    var temp = String(n).compactMap { $0.wholeNumberValue }
    print(temp) // 결과: [1, 2, 3, 4]

     

    - 문자열을 반대로 -> reversed(), collection을 반대로 -> reverse()

    * reversed() -> O(1), reverse() -> O(N)

    var temp = [1, 2, 3, 4]
    print(Array(temp.reversed()))
    // Array를 씌워줘야 [4, 3, 2, 1] 이 나온다

     

    배열을 이어서 출력하기 (joined(separator: "")

    let cast = ["Vivien", "Marlon", "Kim", "Karl"]
    let list = cast.joined(separator: ", ")
    print(list)
    // Prints "Vivien, Marlon, Kim, Karl"

     

    정수의 각 자리를 정렬한 후 새로운 정수를 리턴하기

    정수를 리스트로 변환 -> 정렬 -> 다시 하나의 정수로 만들기

    func solution(_ n: Int) -> Int {
        // 정수를 문자열로 변환하여 각 자릿수를 문자 배열로 만듭니다.
        let digits = String(n).compactMap { Int(String($0)) }
        
        // 자릿수를 내림차순으로 정렬합니다.
        let sortedDigits = digits.sorted(by: >)
        
        // 내림차순으로 정렬된 자릿수 배열을 다시 정수로 변환합니다.
        let sortedNumber = Int(sortedDigits.map { String($0) }.joined()) ?? 0
        
        return sortedNumber
    }
    
    // 예시: 118372를 호출하면 873211을 반환합니다.
    print(solution(118372)) // Output: 873211

     

    사전(Dictionary)

    Key값을 tuple로 넣는 경우

    struct Pair: Hashable {
        let first: Int
        let second: Int
        
        func hash(into hasher: inout Hasher) {
            hasher.combine(first)
            hasher.combine(second)
        }
        
        static func ==(lhs: Pair, rhs: Pair) -> Bool {
            return lhs.first == rhs.first && lhs.second == rhs.second
        }
    }

    Dictionary 선언 및 초기화

    var myDictionary: [ Pair : String ] = [ : ]
    myDictionary[Pair(first: 1, second: 1)] = "One-One" 
    myDictionary[Pair(first: 2, second: 3)] = "Two-Three" 
    myDictionary[Pair(first: 4, second: 5)] = "Four-Five"

    * 하지만 Swift 4.2 이상부턴, 

    // 키값 튜플 만들기
    struct PopKey: Hashable {
        let x: Int
        let y: Int
    }

    이렇게 작성해도, 위의 hash, 비교함수를 자동으로 생성한다.

Designed by Tistory.