swift 기초 부분 수기

용어
연산 자 는 1 원, 2 원, 3 원 연산 자로 나 뉜 다.
  • 1 원 연산 자 는 단일 조작 대상 에 대해 조작 하고 1 원 연산 자 는 선행 연산 자 와 사후 연산 자 로 나 뉘 며 선행 연산 자 는 조작 대상 앞 (!b) 에 바짝 따라 야 하 며, 사후 연산 자 는 조작 대상 뒤 (c!)
  • 에 바짝 따라 야 한다.
  • 이원 연산 자 는 두 개의 조작 대상 을 조작 하 는데 (2 + 3) 은 중간 에 설치 되 어 있다. 왜냐하면 그들 은 두 조작 대상 사이 에 나타 나 기 때문이다.
  • 3 원 연산 자 는 3 개의 조작 대상 을 조작 하 는데 C 언어 와 마찬가지 로 Swift 는 3 원 연산 자 만 있 고 3 개의 연산 자 (a ? b : c)
  • 이다.
    tips 잉여 연산 자 에서 나 누 는 기 호 는 무시 되 고 다른 영향 을 주지 않 습 니 다 -9 % -2 = -9 % 2 공 합 연산 자 a! =nil ? a! : b 등가 a?b 구간 연산 자 1... 5 는 1 에서 5 폐 구간 1... < 5 는 1 에서 4 반 까지 구간 을 표시 합 니 다.
  • 문자열 의 글자 수 는 다음 과 같은 특수 문자
  • 가 있 습 니 다.
    전의 문자 \ 0 (빈 문 자 는 0), \ (역 사선), \ t (수평 탭 문자), (줄 바 꿈), \ r (리 턴 문자), '(작은 따옴표),' (작은 따옴표).
    2 문자열 과 문자
    빈 문자 아래 두 가 지 는 등가 의 var empty String = "var anotherEmpty String = String () 문자열 은 값 형식 입 니 다. 새로운 문자열 을 만 들 었 다 면 상수, 변수 할당 작업 을 하거나 함수, 방법 에서 전달 할 때 복사 합 니 다.
    3. 배열 과 사전
    배열 은 isEmpty 로 배열 이 빈 배열 의 count 가 0 인지 판단 할 수 있 습 니 다. isEmpty 는 true 사전 으로 updateValue 로 값 을 수정 하고 값 을 추가 할 수 있 으 며 값 을 제거 할 수도 있 습 니 다.
  • key updateaValue 가 존재 한다 면... for Key: key 수정 값
  • key updateaValue 가 존재 하지 않 는 다 면... forKey: key 추가 값
  • key 에 대응 하 는 value 를 nil updateaValue 로 설정 하면 nil forKey: key 수정 값 제거 값
  • 4 api 의 가용성 검사
    if #available(iOS 10, macOS 10.12, *) {
        //   iOS    iOS 10   API,   macOS    macOS 10.12   API
    } else {
        //         iOS   macOS   API
    }
    
    if #available(platform name version, ..., *) {
        APIs   ,     
    } else {
        APIs    ,      
    }
    

    5 가 변 매개 변수
    가 변 매개 변 수 는 0 개 이상 의 값 을 받 아들 일 수 있 습 니 다. 함수 호출 시 가 변 매개 변수 로 함수 매개 변 수 를 지정 하면 불확실 한 수의 입력 값 을 입력 할 수 있 습 니 다. 변수 함수 이름 뒤에 추가 ... 방식 으로 가 변 매개 변 수 를 정의 할 수 있 습 니 다.
      
    
    func arithmeticMean(_ numbers: Double...) -> Double {
        var total: Double = 0
        for number in numbers {
            total += number
        }
        return total / Double(numbers.count)
    }
    arithmeticMean(1, 2, 3, 4, 5)
    //    3.0,    5       。
    arithmeticMean(3, 8.25, 18.75)
    //    10.0,    3       。
       :
                        
    

    6 입 출력 매개 변수
    함수 매개 변 수 는 기본적으로 상수 입 니 다. 함수 체 에서 매개 변수 값 을 변경 하려 고 하면 컴 파일 오류 가 발생 할 수 있 습 니 다.
    함수 에서 매개 변수 값 을 수정 하려 면 입 출력 매개 변수 로 정의 해 야 합 니 다. 매개 변수 정의 전 inout 키 워드 는 입력 매개 변수 앞 에 & 부 호 를 추가 해 야 합 니 다. 바로 이 값 은 함수 에 의 해 수정 할 수 있 습 니 다.
    func swapTwoInts(_ a: inout Int, _ b: inout Int) {
        let temporaryA = a
        a = b
        b = temporaryA
    }
    var someInt = 3
    var anotherInt = 107
    swapTwoInts(&someInt, &anotherInt)
    print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
    //    "someInt is now 107, and anotherInt is now 3"
      :
                   。    swapTwoInts             ,       someInt   anotherInt   。                        。
    

    특수 문자
    전의 자 \0 (빈 문자), \\ (역 사선) \t (수평 탭 문자)
    (줄 바 꿈 문자), /r (리 턴 문자), \" (더 블 따옴표) \' (작은 따옴표). 접두사 / 접 두 사 는 문자열 을 호출 하 는 hasPrefix (:) / hasSuffix (:) 를 통 해 같 습 니 다.방법 은 문자열 이 특정한 접두사 / 접 두 사 를 가지 고 있 는 지 확인 합 니 다. 두 방법 은 모두 하나의 string 형식의 인 자 를 받 아들 이 고 불 값 을 되 돌려 줍 니 다.
    8 함수
    모든 함수 에는 특정한 함수 유형 이 있 고 함수 의 유형 은 함수 의 매개 변수 유형 과 반환 유형 으로 구성 된다.
  • 원 그룹 반환 유형 선택
  • func minMax(array:[Int]) -> (min:Int, max:Int)? {}
    

    선택 가능 한 원 그룹 형식 은 원 그룹의 모든 요소 값 을 선택 할 수 있 는 것 이 아니 라 전체 원 그룹 을 선택 할 수 있 음 을 표시 합 니 다 (min:Int?,max:Int?).
  • 기본 매개 변 수 는 함수 에서 매개 변수 에 값 을 부여 하여 기본 매개 변 수 를 정의 합 니 다. 기본 값 이 정의 되면 이 함 수 를 호출 할 때 이 매개 변 수 를 무시 하고 기본 매개 변수
  • 를 직접 사용 할 수 있 습 니 다.
    fun someInt(_ someInt:Int = 1) {}
    

    일반적인 상황 에서 우 리 는 기본 매개 변수 값 이 없 는 매개 변 수 를 함수 매개 변수 목록 앞 에 놓 고 기본 매개 변 수 를 함수 매개 변수 목록 뒤에 놓 습 니 다.
  • 함수 유형
  • func mathAdd(first:Int,second:Int) -> Int {
    return first + second
    }
    
    var mathfunction:(Int,Int) -> Int = mathAdd(first:second:)
    mathfunction(4, 6)
    
  • 내장 함수
  • func chooseStepFunction(backward: Bool) -> (Int) -> Int {
        func stepForward(input: Int) -> Int { return input + 1 }
        func stepBackward(input: Int) -> Int { return input - 1 }
        return backward ? stepBackward : stepForward
    }
    

    폐쇄
    패 킷 을 닫 는 것 은 포 함 된 함수 코드 블록 입 니 다. 코드 에서 패 킷 을 전달 하고 사용 하면 컨 텍스트 의 임의의 상수 와 변 수 를 캡 처 하고 저장 할 수 있 습 니 다. 패 킷 상수 와 변수 라 고 합 니 다. 패 킷 을 닫 는 표현 식 에 서 는 함수 와 반환 값 형식 이 괄호 가 아 닌 괄호 안에 적 혀 있 습 니 다. 패 킷 을 닫 는 함수 체 부분 에 키워드 in 가 있 습 니 다.도입, 이 키 워드 는 패 킷 을 닫 는 매개 변수 와 반환 형식 정의 가 완료 되 었 음 을 나타 내 며, 패 킷 함수 체 가 곧 시 작 됩 니 다.
         
    {(parameters)-> returntype in
    sttements
    }
    
            
    let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
    
    

    패 킷 을 닫 는 완전한 쓰기 도 제 가 현재 사용 하고 있 는 것 입 니 다. 패 킷 을 닫 는 매개 변수 와 반환 유형 을 모두 설명 하고 in 뒤에 논 리 를 씁 니 다.
    names.sorted(by: { (s1: String, s2: String) -> Bool in
        return s1 > s2
    })
    
         
    names.sorted { (a, b) -> Bool in
      return    a > b
    }
    
    names.sorted { (a, b) -> Bool in
        a > b
    }
    
  • 상하 문 추측 에 의 하면 정렬 폐쇄 함수 가 sorted(by:) 방법의 매개 변수 로 들 어 오기 때문에 swift 는 그 매개 변수 와 반환 값 유형 을 추측 할 수 있다. 그러면 유형 을 지정 하지 않 고 간단하게 쓸 수 있다
  • names.sorted(by: { s1, s2 in return s1 > s2 } )
    
  • 단일 표현 식 패키지 암시 적 반환
  • names.sorted(by: { s1, s2 in s1 > s2 } )
    

    이 예 에서 sorted(by:) 방법 매개 변수 유형 은 패 킷 을 닫 으 려 면 bool 형식 으로 돌아 가 야 한 다 는 것 을 명 확 히 했 습 니 다. 패 킷 함수 체 는 하나의 표현 식 (s1 > s2) 만 포함 되 어 있 습 니 다. 이 표현 식 은 Bool 형식 값 으로 돌아 가기 때문에 잘못된 뜻 이 없습니다. return 키 워드 는 생략 할 수 있 습 니 다.
  • 매개 변수 이름 줄 임 말
  • names.sorted(by: { $0 > $1 } )
    

    패 킷 식 에서 매개 변수 이름 줄 임 말 을 사용 하면 패 킷 에서 매개 변수 목록 을 생략 할 수 있 으 며, 매개 변수 이름 줄 임 말 유형 은 함수 형식 으로 추정 in 키 워드 를 생략 할 수 있 습 니 다. 이 경우 패 킷 식 은 패 킷 함수 로 구성 되 어 있 기 때 문 입 니 다. $0'$1' 과 함께 패키지 의 첫 번 째 와 두 번 째 String 형식의 인 자 를 표시 합 니 다.
  • 연산 자 방법
  • names.sorted(by: >)
    

    위의 예 에서 닫 힌 표현 식 을 더 간단하게 작성 할 수 있 습 니 다. Swift 의 String 형식 은 번호 (>) 이상 의 문자열 을 정의 합 니 다. 함수 로 서 두 개의 String 형식의 인 자 를 받 아들 이 고 Bool 형식의 값 을 되 돌려 줍 니 다. 이것 은 sorted (by:) 와 같 습 니 다.방법의 매개 변수 에 필요 한 함수 형식 이 일치 합 니 다. 따라서 번호 보다 큰 문자열 함 수 를 간단하게 전달 할 수 있 습 니 다. Swift 는 번호 보다 큰 문자열 함 수 를 사용 하고 싶 은 지 자동 으로 추정 할 수 있 습 니 다.
  • 가방 닫 기
  • 함수 에 긴 패 킷 표현 식 을 마지막 매개 변수 로 전달 하려 면 패 킷 을 닫 아 함수 의 가 독성 을 높 일 수 있 습 니 다. 패 킷 을 닫 는 것 은 함수 괄호 뒤에 쓰 는 패 킷 표현 식 입 니 다. 함수 가 마지막 매개 변수 로 호출 하 는 것 을 지원 합 니 다. 패 킷 을 닫 을 때 매개 변수 탭 을 쓰 지 않 아 도 됩 니 다.
    reversedNames = names.sorted() { $0 > $1 }
         
    reversedNames = names.sorted { $0 > $1 }
    
  • 값 캡 처 swift 는 정 의 된 컨 텍스트 에서 상수 나 변 수 를 캡 처 할 수 있 습 니 다. 이러한 상수 와 변수의 원 역할 영역 이 존재 하지 않 더 라 도 패 킷 을 닫 는 함수 에서 이 값 을 참조 하고 수정 할 수 있 습 니 다
  • .
    func makeIncrementer(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        func incrementer() -> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementer
    }
    

    이 방법 은 반환 유형 ()-> Int 이라는 것 은 하나의 함수 가 incrementer 이 함수 에서 위의 잔 무늬 에서 이 두 값 runningTotalamount 의 인용 을 캡 처 한 것 을 의미 합 니 다. 캡 처 인용 은 이 두 변 수 를 호출 makeIncrementer 한 후에 사라 지지 않 고 다시 한 번 실행 incrementer 함 수 를 쓸 때 runningTotal 여전히 저장 하도록 보장 합 니 다.
  • 주의: 최 적 화 를 위해 하나의 값 이 패 킷 에 의 해 변경 되 지 않 거나 패 킷 을 닫 은 후에 변경 되 지 않 으 면 swift 는 값 에 대한 복사 본 을 캡 처 하고 저장 하 는 것 으로 바 뀔 수 있 습 니 다. swift 도 캡 처 변수의 모든 메모리 관리 업 무 를 책임 집 니 다. 더 이상 필요 하지 않 은 변 수 를 방출 하 는 것 을 포함 합 니 다.
  • 예시
    let incrementByTen = makeIncrementer(forIncrement: 10)
    incrementByTen()
    //      10
    incrementByTen()
    //      20
    incrementByTen()
    //      30
    
  • 탈출 패 킷 은 하나의 패 킷 을 매개 변수 로 함수 에 전달 되 었 으 나, 이 패 킷 은 함수 가 돌아 온 후에 야 실 행 됩 니 다. 우 리 는 패 킷 을 닫 고 함수 에서 탈출 하 는 것 이 라 고 합 니 다. 패 킷 을 닫 고 탈출 하 는 방법 은 이 패 킷 을 함수 외부 에서 정의 하 는 변수 에 저장 하 는 것 입 니 다. 비동기 작업 을 시작 하 는 함수 들 은 하나의 패 킷 파 라미 터 를 completion handler 로 받 아들 이 는 것 입 니 다.함 수 는 비동기 작업 이 시 작 된 후 즉시 방법 을 사용 하지만, 패 킷 은 비동기 작업 이 끝 난 후에 야 호출 된다 는 것 을 알 고 있 습 니 다. 이러한 상황 에서 패 킷 을 닫 으 려 면 '탈출' 함수 가 필요 합 니 다. 패 킷 을 닫 으 려 면 함수 가 돌아 온 후에 호출 되 어야 하기 때 문 입 니 다.
  •         
    var completionHandlers: [() -> Void] = []
    func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
        completionHandlers.append(completionHandler)
    }
    
        
        func someFunctionWithEscapingClosure(completionHandler:   @escaping () -> Void)  {
            DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 1) { 
                completionHandler()
            }
            
        }
    

    tips: 닫 힌 패 키 지 를 @ escaping 으로 표시 합 니 다. 닫 힌 패 키 지 를 표시 해 야 한다 고 생각 합 니 다 self
  • 자동 닫 기 자동 닫 기 는 함수 에 전달 되 는 패 키 지 를 매개 변수 로 자동 으로 만 드 는 패 키 지 를 사용 하 는 표현 식 입 니 다. 이 패 키 지 는 어떠한 매개 변수 도 받 아들 이지 않 습 니 다. 호출 될 때 포 장 된 표현 식 으로 되 돌아 갑 니 다. 이러한 편리 한 문법 은 패 키 지 를 닫 는 괄호 를 생략 하고 일반적인 표현 식 으로 패 키 지 를 대체 할 수 있 습 니 다. 자동 닫 기 는 패 키 지 를 사용 합 니 다.이 패 킷 을 호출 할 때 까지 코드 가 실 행 될 수 있 기 때문에 값 을 늦 출 수 있 습 니 다.
  • var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
    print(customersInLine.count)
    //     "5"
    
    let customerProvider = { customersInLine.remove(at: 0) }
    print(customersInLine.count)
    //     "5"
    
    print("Now serving \(customerProvider())!")
    // Prints "Now serving Chris!"
    print(customersInLine.count)
    //     "4"
    

    패 킷 을 닫 는 코드 에서 customerInLine 의 첫 번 째 요 소 는 제거 되 었 지만, 패 킷 이 호출 되 기 전에는 이 요 소 는 제거 되 지 않 습 니 다. 이 패 킷 이 영원히 호출 되 지 않 는 다 면, 패 킷 안에 있 는 표현 식 은 영원히 실행 되 지 않 습 니 다. 목록 에 있 는 요 소 는 영원히 제거 되 지 않 습 니 다. customerProvider 의 종 류 는 String 이 아 닙 니 다., () - > String 입 니 다. 인자 가 없고 값 을 String 으로 되 돌려 주 는 함수 입 니 다.
    패 킷 을 매개 변수 로 함수 에 전달 할 때 같은 지연 값 을 구 할 수 있 습 니 다.
    // customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]
    func serve(customer customerProvider: () -> String) {
        print("Now serving \(customerProvider())!")
    }
    serve(customer: { customersInLine.remove(at: 0) } )
    //     "Now serving Alex!"
    

    이 serve (customer:) 함 수 는 고객 의 이름 을 되 돌려 주 는 현식 패 키 지 를 받 습 니 다. 아래 버 전의 serve (customer:) 는 같은 동작 을 완 료 했 지만, 현식 패 키 지 를 받 아들 이지 않 고, 인 자 를 @ autoclosure 로 표시 해서 자동 패 키 지 를 받 습 니 다. 이 함 수 를 패 키 지 않 고 String 형식의 인자 로 받 아들 일 수 있 습 니 다.이 매개 변 수 는 @ autoclosure 특성 이 표시 되 어 있 기 때문에 customerProvider 매개 변 수 는 자동 으로 닫 힌 패키지 로 전 환 됩 니 다.
    // customersInLine is ["Ewa", "Barry", "Daniella"]
    func serve(customer customerProvider: @autoclosure () -> String) {
        print("Now serving \(customerProvider())!")
    }
    serve(customer: customersInLine.remove(at: 0))
    //    "Now serving Ewa!"
    

    자동 으로 가방 을 닫 고 도망 갈 수 있 는 것 을 원한 다 면 @ autolosure 와 @ escaping 속성 을 동시에 사용 합 니 다.
    // customersInLine i= ["Barry", "Daniella"]
    var customerProviders: [() -> String] = []
    func collectCustomerProviders(_ customerProvider: @autoclosure @escaping () -> String) {
        customerProviders.append(customerProvider)
    }
    collectCustomerProviders(customersInLine.remove(at: 0))
    collectCustomerProviders(customersInLine.remove(at: 0))
    
    print("Collected \(customerProviders.count) closures.")
    //    "Collected 2 closures."
    for customerProvider in customerProviders {
        print("Now serving \(customerProvider())!")
    }
    //    "Now serving Barry!"
    //    "Now serving Daniella!"
    

    지식 이 약 하 다

    좋은 웹페이지 즐겨찾기