Swift의 "잠언 63;"및처음부터 겸손히

26034 단어 Swifttech

개시하다


Swift로 코드를 쓸 때?!의 기호가 빈번하게 나타난다.엑스코드에서 스와프를 사용해 개발할 때 보완 기능으로'픽스'버튼을 누르면 Warning도 사라지고, 이것이 무엇인지 체계적으로 이해하지 않으면 이런 포치포 프리 스타일도 제한된다.
따라서 본고는 Swift 코드에 나타난 각종 상황?!에 대해 총괄하였다.
목록이나'총결'에 실린 표를 참고하면 역인용이 비교적 편리할 것이다.

형후의및 "시험"


Swift에서 변수를 선언할 때 유형 뒤의・"실패 33;"이것은 변수를 임의의 형식으로 표시할 때 사용합니다. Swift에서는 nil을 변수에 대입할 수 없습니다. nil을 대입할 수 있도록 하려면,변수를 선언할 때는 변수를 선택 유형 변수로 선언해야 합니다. Swift의 선택 유형 변수는 선택 유형(Optional Value)과 암시적 해결 유형(Implicitly Unwrapped Optional) 두 가지가 있습니다.
var hoge: Int //Int型(nilを許容しない)
var fuga: Int? //オプショナルInt型(nilを許容する)
var piyo: Int! //暗黙的アンラップInt型(nilを許容する)
선택된 유형 변수와 비선택된 유형 변수는 같은 Int형이라도 다른 데이터 유형으로 간주됩니다.
var hoge: Int = 10 //Int型(nilを許容しない)
var fuga: Int? = 10 //オプショナルInt型(nilを許容する)
var piyo: Int! = 10 //暗黙的アンラップInt型(nilを許容する)

print(hoge) //10
print(fuga) //Optional(10)
print(piyo) //Optional(10)
따라서 이 변수에 대해 두 가지 연산을 하면 서로 다른 유형의 변수 간의 계산 오류가 발생할 수 있다.
var hoge: Int = 10//Int型(nilを許容しない)
var fuga: Int? = 10//オプショナルInt型(nilを許容する)

print(hoge + fuga)

//---- 以下出力されるエラー ----//
error: value of optional type 'Int?' must be unwrapped to a value of type 'Int'
print(hoge + fuga)
이때 이 연산을 실행하기 위해 임용형 변수에 저장된 값을 추출하기 위해 마운트 해제 작업을 해야 한다.
선택한 형식 변수 중의 스텔스 코일 형식은 연산을 실행할 때 자동으로 (스텔스) 코일 작업을 실행합니다.
var hoge: Int = 10//Int型(nilを許容しない)
var piyo: Int! = 10//暗黙的アンラップInt型(nilを許容する)

print(piyo)//Optional(10)
print(hoge + piyo)//20
print(piyo == 10)//true
단, piyo=nil의 경우 마운트 해제할 때 nil과 (nil이 허용되지 않음) 비자선형에 대한 두 가지 연산으로 인해 오류가 발생할 수 있습니다. 따라서 nil의 가능성을 이유로 변수를 은근히 자선형으로 성명하는 것은 위험합니다.
var hoge: Int = 10//Int型(nilを許容しない)
var piyo: Int! = nil//オプショナルInt型(nilを許容する)

print(piyo)//nil
print(hoge + piyo)//エラー
print(piyo == 10)//エラー

이름 뒤에및 "시험"


Swift 코드에 나타나는및 "시험"후접 변수나 방법 등 이름및 "시험"위에서 언급한 마운트 해제 작업을 수행하는 기호입니다. 이름 뒤에 쓰여 있습니다.실패와 실패의 처리는 Forced Unwrapping(강제 제거)과 Optional Chaaining(자동 조정)을 요약한 것입니다.
<オプショナル型変数>! ← Forced Unwrapping (強制的アンラップ)
<クラス>.<オプショナル型のプロパティ>?.<プロパティ他>Optional Chaining (オプショナルチェイニング)

Forced Unwrapping(강제 제거)


Forced Unwrapping(강제 언로드)은 임용 변수에 어떤 값을 입력하든지 언로드하는 방법입니다. 다음 기법은 임용 변수를 비임용 변수로 변환합니다.
<オプショナル型変数>!

var fuga: Int? = 10//オプショナルInt型(nilを許容する)

print(fuga)//Optional(10)
print(fuga!)//10
그러나fuga에nil이 있는 경우에도 강제로 마운트 해제해야 하며 이 경우 오류가 발생할 수 있습니다.
var fuga: Int? = nil//オプショナルInt型(nilを許容する)

print(fuga!)//エラー
따라서 Forced Unwrapping에 따라 마운트 해제할 경우 이 변수의 값이 보장되었는지 확인하고다음을 참조하십시오.)
The exclamation mark effectively says, “I know that this optional definitely has a value; please use it.”

Optional Chaning(선택)


Optional Chaning은 보안 호출 클래스에서 선택할 수 있는 속성과 방법입니다. 아래의 예를 보십시오. (공식 문서 참조)
class Person {
    var residence: Residence?
}

class Residence {
    var numberOfRooms = 1
}
이렇게 Person류를 정의한 토대에서 Person류의 실례인 John의residence를 정의했다.numberOfRooms를 가져오는 것을 고려하십시오. 다음 절차에 따라numberOfRooms를 가져오려고 하면 오류가 발생합니다.
let john = Person()//この時点で特段イニシャライザの処理をしていないのでjohn.residenceはnil
let roomCount = john.residence!.numberOfRooms//john.residence!のアンラップ失敗でnumberOfRoomsが取得できずエラー
print(roomCount)//エラー
위 상황에서 선택한 유형의 대상에 nil이 포함될 수 있는 경우 Forced Unwrapping으로 인해 오류가 발생했습니다. 이 경우 Optional Chaning을 이용하면 더욱 안전하게 Residence를 사용할 수 있습니다.numberOfRooms를 얻을 수 있습니다.
Optional Chaning에서 다음 메서드에서 참조 속성과 메서드입니다.
<クラス>.<オプショナル型のプロパティ/メソッド>?.<プロパティ/メソッド>...
Optional Chaaining은 Forced Unwrapping과 달리 <임용형 속성/방법>이nil일 경우 이후의 속성과 방법을 참조하지 않고 nil로 돌아갑니다.
let john = Person()

if john.residence?.numberOfRooms != nil {
    let roomCount = john.residence?.numberOfRooms ?? 0
    print(roomCount)
} else {
    print("住所なし")//こちらが出力される
}
따라서 강제 마운트 해제 없이 선택한 유형의 대상을 안전하게 처리할 수 있습니다. 위의 예는john이 존재하지 않을 수도 있습니다.residence.number OfRooms에 직접 접근하지 않고, Residence가 nil인지 nil인지 여부에 따라 후속 처리를 변경할 수 있습니다.
또 상기 임용형 변수가 니엘인지에 따라 후속 처리에 이견을 일으키기 위해 더 신경을 쓰는 메커니즘이 있다.

옵션 바인딩


위에서 말한 바와 같이 Optional Binding은 선택형 변수가 nil인지 여부에 따라 후속 처리를 분리하는 메커니즘이다.Optional Binding에는 다음 두 가지 구문이 있습니다.
  • if let
  • guard let
  • if let


    iflet 문장은 다음 문법의 지점 처리를 기술합니다.
    if let <変数> = <オプショナル型変数> { 
        // <オプショナル型変数>にnilが含まれていない場合の処理
    } else {
        // <オプショナル型変数>にnilが含まれている場合の処理
    }
    
    if let 문에서 조건식 오른쪽 가장자리의 <선택형 변수>에 nil이 포함되지 않을 경우 제거된 값을 로컬 변수 왼쪽 가장자리의 <변수>로 블록에서 사용할 수 있습니다.
    예제
    따라서 처음에 서술한 지난번 Person형의 예는 다음과 같다.
    var fuga : Int? = 10//オプショナルInt型(nilを許容する)
    
    if let _fuga = fuga { 
        print(_fuga)
    } else {
        print("にる")
    }
    
    //----出力----
    //10
    
    let john = Person()
    john.residence = Residence()
    
    if let _numberOfRooms = john.residence?.numberOfRooms {
        print(_numberOfRooms)
    } else {
        print("住所なし")//こちらが出力される
    }
    

    guard let


    이중 언어let문장을 사용하면 마운트 해제할 때 임용 변수가 nil을 포함하면 처리를 중단할 수 있습니다. 이중 언어let문장은 함수에서만 사용할 수 있습니다.
    let john = Person()
    john.residence = Residence()//ここを追加
    
    if let _numberOfRooms = john.residence?.numberOfRooms {
        print(_numberOfRooms)//こちらが出力される(1)
    } else {
        print("住所なし")
    }
    

    guardlet문에서iflet문과 달리guardlet문 다음에 마운트 해제된 값을 사용할 수 있습니다.

    식의 "시도"부식


    변수 유형과 변수 이름 뒤에 연산자로에 나타나다최면술뜻이 각기 다르다.

    삼원 연산자"


    "?"하나의 문자는 삼원 연산자를 나타낸다.
    guard let <変数> = <オプショナル型変数> else { return }
    //後続処理
    

    func printFuga(_ fuga: Int?) {
      guard let _fuga = fuga else { return }
        print(_fuga)
    }
    
    var fuga : Int? = 10//オプショナルInt型(nilを許容する)
    printFuga(fuga)
    
    //----出力----
    //10
    
    세 가지 연산자 자체는 선택형과 직접적인 관계가 없다.

    Nil coalescing operator "??"


    "??"두 문자인 경우 Nil coalescing operator라는 연산자를 나타냅니다.
    変数 = 条件式 ? (真の場合の値) : (偽の場合の値)
    
    세 가지 연산자"Nil coalescing operator, 조건식 진위를 기준으로 평가 값 지정자변수가 nil인지 여부에 따라 평가 값을 나눈다. 위의 예에서 자변수의 값이 nil이 아니라면, 이 값은 nil의 경우 ?? 오른쪽(nilの場合の値)에서 변수를 대입한다.
    선택할 수 있는 변수 값을 nil 시대입의 기본값으로 사용할 때 편리합니다.
    예제
    let a = 10
    let b = 20
    
    let result = a == b ? "EQUAL" : "NOT EQUAL"
    print(result)//NOT EQUAL
    

    as 뒤에 있는'다63;'및 "시험"


    마지막으로 정리를 해볼게요.・"실패 33;"as 연산자 뒤에 있는 거예요?・as️!연산자는 모듈 카드에서 압력을 낮출 때 사용된다.

    as?


    다운로드에 실패하면 실제 실패하고nil로 돌아가며, 성공하면 선택한 형식으로 돌아갑니다.
    예제
    変数 = オプショナル型変数 ?? (nilの場合の値)
    

    as!


    낮추면 유형 분배를 강제하고 실패하면 오류가 발생합니다.
    class Person {
        var residence: Residence?
    }
    
    class Residence {
        var numberOfRooms = 1
    }
    
    let john = Person()
    
    let _numberOfRooms = john.residence?.numberOfRooms ?? 0
    print(_numberOfRooms.description)//0
    

    총결산


    이번 보도에서 언급된・"실패 33;"를 참고하십시오.

    참고 자료

  • 어느 곳보다 쉽게 이해할 수 있는 스위프트.및 "시험"
  • the swift programming languageswift 5.1
  • Swift의 Nil 결합 산수(Nil-Colescing Operator)
  • 탤런트정보

  • 이곳 내용도 내가 집필한블로그 버스에 실렸다.이쪽도 잘 부탁드립니다.

    좋은 웹페이지 즐겨찾기