Swift의 "잠언 63;"및처음부터 겸손히
개시하다
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
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;"를 참고하십시오.
참고 자료
덤
이곳 내용도 내가 집필한블로그 버스에 실렸다.이쪽도 잘 부탁드립니다.
Reference
이 문제에 관하여(Swift의 "잠언 63;"및처음부터 겸손히), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/mhackit/articles/0950bf9102810fb9df5f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)