Swift 옵션 값은 무엇입니까?
하시면 됩니다.
if★★★★★★★★★★★★★★★★★」let을 사용하다이러한 값은 옵션으로 표시됩니다.은 값을 하거나 값을 합니다.nil값이 누락되었음을 나타냅니다..?값을 옵션으로 마킹하는 값 유형 뒤에 표시됩니다.
옵션 값을 사용하는 이유는 무엇입니까?
Swift의 옵션에는 값을 포함할 수도 있고 값을 포함하지 않을 수도 있는 유형이 있습니다.옵션에는 다음 항목을 추가하여 기술합니다.?든든: :
var name: String? = "Bertie"
옵션(Generics와 함께)은 Swift의 가장 이해하기 어려운 개념 중 하나입니다.그것들은 쓰여지고 사용되는 방식 때문에, 그들이 무엇인지에 대해 잘못 알기 쉽다.위의 옵션과 일반 문자열을 비교합니다.
var name: String = "Bertie" // No "?" after String
구문을 보면 옵션의 String은 일반 String과 매우 유사합니다.그런거 아냐.선택적 문자열은 일부 "선택적" 설정이 설정된 문자열이 아닙니다.특별한 종류의 String은 아닙니다.String과 옵션의 String은 전혀 다른 유형입니다.
가장 중요한 것은 다음과 같습니다.옵션으로는 컨테이너의 종류를 들 수 있습니다.선택적 String은 String을 포함할 수 있는 컨테이너입니다.선택적 Int는 Int를 포함할 수 있는 컨테이너입니다.선택사항은 소포의 한 종류라고 생각하세요.열기(또는 옵션 언어로 "포장 해제") 전에는 이 패키지에 무엇이 포함되어 있는지 알 수 없습니다.
Swift 파일에 "Optional(옵션)"을 입력하고 클릭하여 Swift Standard Library에서 옵션 구현 방법을 확인할 수 있습니다.정의의 중요한 부분은 다음과 같습니다.
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
'이이,,'입니다.enum 경우 중 가 될 수..none ★★★★★★★★★★★★★★★★★」.some만약 그렇다면.some에서 볼 수 과 같은이 있는 값이 있습니다.String"제너릭" 에서는 Generics를 합니다.제네릭스이 String이 String은 ,,,,,,,,입니다.Optional 정확하게는, 「」입니다.Optional<String>.
옵션에서 Swift가 수행하는 모든 작업은 코드를 읽고 쓸 수 있도록 하는 마술입니다.불행하게도 이것은 실제 작동 방식을 흐리게 한다.제가 나중에 몇 가지 요령들을 살펴보도록 하겠습니다.
주의: 옵션 변수에 대해 많이 이야기하겠지만 옵션 상수도 만들 수 있습니다.작성되는 유형 유형을 쉽게 이해할 수 있도록 모든 변수를 유형으로 표시하지만 자체 코드를 사용할 필요는 없습니다.
옵션 작성 방법
하려면 , 「」를 합니다.?줄바꿈할 유형 뒤에 있습니다.임의의 타입이 옵션입니다.사용자 고유의 커스텀 타입도 마찬가지입니다. 쓸 수 .?.
var name: String? = "Bob" // Create an optional String that contains "Bob"
var peter: Person? = Person() // An optional "Person" (custom type)
// A class with a String and an optional String property
class Car {
var modelName: String // must exist
var internalName: String? // may or may not exist
}
옵션 사용
를 '할 수 '에 할 수 .nil값이 있는지 확인합니다.
var name: String? = "Bob"
name = nil // Set name to nil, the absence of a value
if name != nil {
print("There is a name")
}
if name == nil { // Could also use an "else"
print("Name has no value")
}
이건 좀 헷갈리네요.합니다.밥이다.이것은 사실이 아닙니다.선택사항은 다른 것으로 변환되지 않습니다.0과 비교하는 것은 코드를 읽기 쉽게 하기 위한 요령입니다.의 값이, 「0」으로 되어 있는 합니다..none.
옵션만 0일 수 있습니다.
비선택 변수를 0으로 설정하려고 하면 오류가 발생합니다.
var red: String = "Red"
red = nil // error: nil cannot be assigned to type 'String'
옵션을 보는 또 다른 방법은 일반 Swift 변수를 보완하는 것입니다.값이 보장되는 변수에 대응하는 값입니다.스위프트는 모호한 것을 싫어하는 신중한 언어이다.대부분의 변수는 비옵션으로 정의되지만 이것이 불가능한 경우도 있습니다.예를 들어 캐시 또는 네트워크에서 이미지를 로드하는 뷰 컨트롤러를 상상해 보십시오.뷰 컨트롤러가 작성될 때 해당 이미지가 있을 수도 있고 없을 수도 있습니다.이미지 변수의 값을 보장할 방법은 없습니다.이 경우 옵션으로 해야 합니다.은 「」입니다.nil이미지가 취득되면 옵션에서 값을 가져옵니다.
옵션을 사용하면 프로그래머의 의도를 알 수 있습니다.Objective-C와 비교하여 Swift에서는 값이 누락될 수 있는 시기와 값이 존재하는 것이 보증되는 시점을 명확히 해야 합니다.
옵션을 사용하려면 "포장 해제"해야 합니다.
★★String를 할 수 없다String 옵션 내에서 랩된 값을 사용하려면 랩을 풀어야 합니다.하는 가장 은, 「」를 입니다.!옵션 이름 뒤에 있습니다.이것은 "강제 언랩"이라고 불립니다. 유형하지만, 이 "(원래 유형)"의 반환됩니다.nil런타임 크래시의 원인이 됩니다.포장을 풀기 전에 가치가 있는지 확인해야 합니다.
var name: String? = "Bob"
let unwrappedName: String = name!
print("Unwrapped name: \(unwrappedName)")
name = nil
let nilName: String = name! // Runtime crash. Unexpected nil.
선택 사항 확인 및 사용
옵션의 포장을 해제하여 사용하기 전에 반드시 제로 여부를 확인해야 하므로, 이것은 일반적인 패턴입니다.
var mealPreference: String? = "Vegetarian"
if mealPreference != nil {
let unwrappedMealPreference: String = mealPreference!
print("Meal: \(unwrappedMealPreference)") // or do something useful
}
이 패턴에서는 값이 존재하는지 확인한 후 값이 존재하면 강제로 임시 상수로 래핑 해제하여 사용합니다.이것은 매우 흔한 일이기 때문에 Swift는 "if let"을 사용하여 바로 가기를 제공합니다.이를 "옵션 바인딩"이라고 합니다.
var mealPreference: String? = "Vegetarian"
if let unwrappedMealPreference: String = mealPreference {
print("Meal: \(unwrappedMealPreference)")
}
, 인 상수 「로하면 「변수」)가됩니다.letvar의 스코프가 if의 경우의 스코프가 if의 브레이스 범위 내에만 있는 경우." Meal Preference" " Meal Preference같은 해야 하는 있기 변수 할 수 있으며, 범위 에 "unwraped Meal Preference"라는 임시 할 수 .
var mealPreference: String? = "Vegetarian"
if let mealPreference: String = mealPreference {
print("Meal: \(mealPreference)") // separate from the other mealPreference
}
다음은 다른 변수가 사용되고 있음을 나타내는 코드입니다.
var mealPreference: String? = "Vegetarian"
if var mealPreference: String = mealPreference {
print("Meal: \(mealPreference)") // mealPreference is a String, not a String?
mealPreference = "Beef" // No effect on original
}
// This is the original mealPreference
print("Meal: \(mealPreference)") // Prints "Meal: Optional("Vegetarian")"
옵션 바인딩은 옵션이 0과 동일한지 여부를 확인하는 방식으로 작동합니다.그렇지 않으면 옵션에서 지정된 상수로 압축 해제하고 블록을 실행합니다.Xcode 8.3 이후(Swift 3.1)에서는 이와 같은 옵션을 인쇄하려고 하면 불필요한 경고가 발생합니다.「」를 합니다.debugDescription★★★★★★★★
print("\(mealPreference.debugDescription)")
옵션이란 무엇입니까?
옵션에는 다음 두 가지 사용 사례가 있습니다.
- 실패할 수 있는 일(예상했지만 아무것도 얻지 못했다)
- 지금은 아무것도 아니지만 나중에 될 수도 있는 것(및 그 반대)
몇 가지 구체적인 예:
- 도 있고 수도 있는 . 를 들어, 있을 수도 있고 없을 수도 있습니다.
middleName★★★★★★★★★★★★★★★★★」spousein a a a aPerson표시 - 배열에서 일치 검색과 같이 값을 반환하거나 아무것도 반환하지 않는 메서드입니다.
- 파일 내용을 읽으려고 하지만(일반적으로 파일의 데이터를 반환함) 파일이 존재하지 않는 경우와 같이 결과를 반환하거나 오류를 발생시키고 아무것도 반환하지 않는 메서드입니다.
- 위임 속성 - 항상 설정할 필요는 없으며 일반적으로 초기화 후에 위임 속성
- ★★★의
weak은 '지켜다'로 할 수 .nil - 메모리를 회수하기 위해 해제해야 하는 대규모 리소스
- (데이터가 아직되지 않은 를 가 아직 로드되지 않은 경우) 알 수 있는 , "Data Loaded"는 "Data Loaded" 입니다.
Boolean
Optionals (옵션)Objective-C option option option option 。개체를 반환할 수 있는 메서드는 대신 0을 반환할 수 있습니다.이것은 "유효한 물체의 부재"를 의미하는 것으로 받아들여지며, 종종 어떤 것이 잘못되었다고 말할 때 사용됩니다.Objective-C는 C-type(Enum, ,에에)을 말합니다.Objective-C는 종종 이러한 값의 부재를 나타내는 특수 유형을 가지고 있었다.NSNotFound은 정말 '아주'입니다.NSIntegerMax,kCLLocationCoordinate2DInvalid 좌표를 -1을 참조해 주십시오.)코드 작성자는 이러한 특별한 값을 알아야 하므로 각 사례에 대해 문서화 및 학습해야 합니다.가 ""를 받을 수 "nil파라미터로서 이것을 문서화해야 한다.목적-CΩnil 오브젝트가되어 있는 로 포인터입니다만, 「 」는 「 」입니다.nil정) ( 0으로 하다에서는 ★★★★★★★★★★★★★★★★★★★★★★」nil는 특정 유형의 부재를 의미하는 리터럴입니다.
교교와의 nil
할 수 .Boolean:
let leatherTrim: CarExtras? = nil
if leatherTrim {
price = price + 1000
}
에서는 Swift를 .leatherTrim != nil 그럴까★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.Boolean는 옵션으로 포장할 수 있습니다.「 」가 Boolean음음음같 뭇매하다
var ambiguous: Boolean? = false
'거짓은 ''이 두 , ''은 '이, '거짓'은 ''이 요. 하나는 값이 없는 것이고 다른 하나는 값이 있지만 값이 있는 것입니다.false을 싫어하기 에서 Swift를 체크해야 합니다.nil.
옵션의 의미가 무엇인지 궁금할 수 있습니다.Boolean 옵션과 로 른른 is is is is is is is is is is is is is 。.nonestate는 값이 아직 불분명한 것을 나타낼 수 있습니다.네트워크 콜의 다른 쪽 끝에 폴링에 시간이 걸릴 수 있습니다.옵션인 부울란은 "3값 부울란"이라고도 합니다.
재빠른 속임수
Swift는 몇 가지 속임수를 사용하여 옵션이 작동할 수 있도록 합니다.이 세 줄의 일반 외관 옵션 코드를 고려하십시오.
var religiousAffiliation: String? = "Rastafarian"
religiousAffiliation = nil
if religiousAffiliation != nil { ... }
이러한 행은 컴파일 할 수 없습니다.
- 첫 번째 행은 String 리터럴을 사용하여 두 가지 다른 유형을 사용하여 옵션의 String을 설정합니다. 이것이 ★★★★★★★★★★★★★★★★★★★★★★★.
String가 - 두 번째 행에서는 옵션의 String을 2종류의 영으로 설정합니다.
- 세 번째 줄에서는 옵션 문자열을 두 가지 다른 유형의 0과 비교합니다.
이러한 라인이 동작할 수 있도록 하는 옵션의 실장 상세에 대해 설명합니다.
옵션 작성
「」를 사용합니다.?은 Swift컴파일러.swift에 장시간 작업을 수행할 경우 다음과 같은 옵션을 만들 수 있습니다.
var name: Optional<String> = Optional("Bob")
은 「」를 호출합니다.Optional의 첫 이니셜라이저 " " " " " 입니다.public init(_ some: Wrapped)괄호 내에서 사용되는 유형에서 옵션의 관련 유형을 유추합니다.
옵션 작성 및 설정 방법:
var serialNumber:String? = Optional.none
serialNumber = Optional.some("1234")
print("\(serialNumber.debugDescription)")
의 「」의 설정nil
이 '비밀번호'인 수도 .nil(서양속담, 돈속담)
var name: String?
var name: String? = nil
과 같은 것을 허용한다.nil입니다.ExpressibleByNilLiteral 이름(이전 이름)NilLiteralConvertible)는Optional의 두 번째 " " " " 입니다.public init(nilLiteral: ()) ExpressibleByNilLiteral옵션 이외의 경우는, 코드의 0 의 의미가 변경되기 때문에, 다음과 같이 할 수 있습니다.
class Clint: ExpressibleByNilLiteral {
var name: String?
required init(nilLiteral: ()) {
name = "The Man with No Name"
}
}
let clint: Clint = nil // Would normally give an error
print("\(clint.name)")
을 ""로 할 수 .nil권장되지 않지만 nero 리터럴 이니셜라이저를 직접 사용할 수 있습니다.
var name: Optional<String> = Optional(nilLiteral: ())
과 ''의 nil
'=='로!로!로!로!로!로!, =" 연산자, =" Optionalthe . 첫 번째 첫째째번==를 사용하면 임의의 옵션이 0인지 여부를 확인할 수 있습니다..두 가지 다른 항상 .none으로 설정된 두 가지 다른 옵션은 연관된 유형이 동일한 경우 항상 동일합니다.0과 비교할 때 Swift가 동일한 관련 유형의 옵션을 만들고 .none으로 설정한 다음 비교에 이 옵션을 사용합니다.
// How Swift actually compares to nil
var tuxedoRequired: String? = nil
let temp: Optional<String> = Optional.none
if tuxedoRequired == temp { // equivalent to if tuxedoRequired == nil
print("tuxedoRequired is nil")
}
번째 두 the the==연산자를 사용하면 두 가지 옵션을 비교할 수 있습니다. 다 , 그 타입이어야 .Equatable('=='로 하겠습니다).재빠르다또한 옵션 중 하나 또는 양쪽이 다음과 같은 경우에도 처리됩니다..none. 와의해 주세요nil문자 그대로의
어떤 가 가능하다, 비교가 가능하다, 비교가 가능합니다.Equatable하다
let numberToFind: Int = 23
let numberFromString: Int? = Int("23") // Optional(23)
if numberToFind == numberFromString {
print("It's a match!") // Prints "It's a match!"
}
Swift는 비교 전에 선택 사항으로 비선택 사항을 포장합니다..if 23 == numberFromString {)
== 그러나 는 세 nil의
if nil == name { ... }
명명 옵션
옵션 타입의 이름을 비옵션 타입과 다르게 지정하기 위한 Swift 규칙은 없습니다.이름이 옵션임을 보여주기 위해 ("optional MiddleName" 또는 "possibleNumberAsString"과 같이) 이름을 추가하지 않고 선언문에 옵션 유형임을 나타냅니다.옵션의 값을 유지하는 이름을 지정하려는 경우 이 작업이 어려워집니다."middleName"이라는 이름은 String 유형임을 의미하므로 String 값을 추출할 때 "actualMiddleName" 또는 "unwrapedMiddleName" 또는 "realMiddleName"과 같은 이름이 될 수 있습니다.이 문제를 해결하려면 선택적 바인딩을 사용하고 변수 이름을 재사용하십시오.
공식 정의
Swift 프로그래밍 언어의 "기본 사항"에서:
Swift는 값의 부재를 처리하는 옵션 유형도 도입했습니다.옵션에는 "값이 있고 x와 같다" 또는 "값이 전혀 없다"가 있습니다.Options는 Objective-C에서 포인터와 함께 0을 사용하는 것과 비슷하지만 클래스뿐만 아니라 모든 유형에 대해 작동합니다.Options는 Objective-C의 제로 포인터보다 안전하고 표현력이 뛰어나며 Swift의 많은 가장 강력한 기능의 핵심입니다.
선택사항은 Swift가 안전한 유형의 언어라는 사실을 보여주는 예입니다.Swift는 코드를 사용할 수 있는 값의 유형을 명확하게 하는 데 도움이 됩니다.코드의 일부가 문자열을 필요로 하는 경우 safety를 입력하면 실수로 Int를 전달할 수 없습니다.이를 통해 개발 프로세스에서 오류를 최대한 조기에 발견하고 수정할 수 있습니다.
마지막으로 옵션에 관한 1899년의 시를 소개합니다.
는 그곳에.
도 거기에.
안티고니시
기타 자원:
NSError에러가 반환되지 않는 경우는, 옵션으로 「N0」을 반환할 수 있습니다.오류가 없다면 값을 할당하는 것은 의미가 없습니다.
var error: NSError? = nil
이를 통해 기본값을 설정할 수도 있습니다.따라서 함수가 전달되지 않은 경우 메서드를 기본값으로 설정할 수 있습니다.
func doesntEnterNumber(x: Int? = 5) -> Bool {
if (x == 5){
return true
} else {
return false
}
}
하다를 수 .nil 늘 in Swift : "Swift" : "Swift" 는 .그러나 API에서는 특정 종류의 값 또는 값의 결여를 나타낼 수 있는 경우가 많습니다.를들 、 에에 、 에에 、 에??그렇다면 어떤 사람입니까?옵션으로서 Swift의 타입 세이프, 메모리 세이프 방법을 선택할 수 있습니다.
나는 초심자인 내 머릿속의 불확실성을 없애기 위해 위의 대부분을 요약한 짧은 대답을 했다.
Objective-C와는 반대로 Swift에서는 어떤 변수도 0을 포함할 수 없기 때문에 Optional 변수 유형이 추가되었습니다(변수 뒤에 "?를 붙임).
var aString = nil //error
큰 차이는 옵션 변수가 (일반 Obj-C 변수와 마찬가지로) 값을 직접 저장하지 않는다는 것입니다. 이 변수는 다음 두 가지 상태를 포함합니다."값이 있다" 또는 "0이 없다":
var aString: String? = "Hello, World!"
aString = nil //correct, now it contains the state "has nil"
즉, 다양한 상황에서 이러한 변수를 확인할 수 있습니다.
if let myString = aString? {
println(myString)
}
else {
println("It's nil") // this will print in our case
}
접미사 "!"를 사용하면 값이 존재하는 경우에만 값에 액세스할 수 있습니다(즉, 0이 아닙니다).
let aString: String? = "Hello, World!"
// var anotherString: String = aString //error
var anotherString: String = aString!
println(anotherString) //it will print "Hello, World!"
따라서 기본적으로는 "?"와 "!"를 모두 사용하지 않고 사용해야 합니다.(이것은 나의 가장 큰 당혹감이었다)
위의 답변에도 동의합니다.선택적 형식은 부울로 사용할 수 없습니다.
목표 C 변수에서 값이 없는 변수는 'nil'과 같기 때문에(0 및 false와 같은 'nil' 값을 사용할 수도 있음) 조건문에 변수를 사용할 수 있었다(값이 있는 변수는 'TRUE'와 같고 값이 없는 변수는 'FALSE'와 동일).
Swift는 '옵션 값'을 제공하여 형식 안전을 제공합니다.다른 유형의 변수를 할당할 때 발생하는 오류를 방지합니다.
따라서 Swift에서는 조건문에 boolean만 제공될 수 있습니다.
var hw = "Hello World"
여기서 'hw'는 문자열이지만 목적 C와 같은 if 문에서는 사용할 수 없습니다.
//This is an error
if hw
{..}
그러기 위해서는 다음과 같이 작성해야 합니다.
var nhw : String? = "Hello World"
//This is correct
if nhw
{..}
옵션의 값을 사용하면, 값이 없는 것을 표시할 수 있습니다.SQL의 NULL이나 Objective-C의 NS Null과 약간 비슷합니다.이것은 '원시적인' 타입에서도 사용할 수 있기 때문에 개선이라고 생각합니다.
// Reimplement the Swift standard library's optional type
enum OptionalValue<T> {
case None
case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)”
출처: Apple Inc.에서 발췌.'스위트 프로그래밍 언어' 아이북스https://itun.es/gb/jEUH0.l
옵션인 경우 Swift는 값이 유형에 대응하는지 여부를 완전히 알 수 없습니다.예를 들어 Int?는 숫자가 Int인지 아닌지 Swift가 완전히 알 수 없음을 의미합니다.
이를 제거하기 위해 세 가지 방법을 사용할 수 있습니다.
1) 타입이 확실하다면 느낌표를 사용하여 다음과 같이 강제로 개봉할 수 있습니다.
// Here is an optional variable:
var age: Int?
// Here is how you would force unwrap it:
var unwrappedAge = age!
옵션의 강제 언랩을 실행했을 때, 제로인 경우, 다음의 크래시 에러가 발생할 수 있습니다.
이것은 반드시 안전하다고는 할 수 없습니다.따라서 타입과 값을 모르는 경우 크래시를 방지할 수 있는 방법이 있습니다.
방법 2와 방법 3은 이 문제에 대한 보호를 제공합니다.
2) 암묵적으로 언랩된 옵션
if let unwrappedAge = age {
// continue in here
}
포장되지 않은 유형은 Int가 아니라 Int입니다.
3) 가드 스테이트먼트
guard let unwrappedAge = age else {
// continue in here
}
여기서 랩 해제 변수를 사용할 수 있습니다.변수의 종류를 알고 있는 경우는 반드시 강제 언랩(!)만 해 주세요.
당신의 프로젝트에 행운을 빌어요!
내가 배우기 시작했을 때, 왜 선택권이 있는지 깨닫는 것은 매우 어려웠다.
이렇게 생각해 봅시다.로 하겠습니다.Person 성질을 있다.name ★★★★★★★★★★★★★★★★★」company.
class Person: NSObject {
var name : String //Person must have a value so its no marked as optional
var companyName : String? ///Company is optional as a person can be unemployed that is nil value is possible
init(name:String,company:String?) {
self.name = name
self.companyName = company
}
}
이번에는 몇 .Person
var tom:Person = Person.init(name: "Tom", company: "Apple")//posible
var bob:Person = Person.init(name: "Bob", company:nil) // also Possible because company is marked as optional so we can give Nil
그냥 지나칠 수 요.Nil로로 합니다.name
var personWithNoName:Person = Person.init(name: nil, company: nil)
에는 왜 쓰는지 요?optional?을 추가하고 을 생각해 . Inc 에 붙이는 것apple 되다apple Inc을 해요.Inc회사 이름과 인쇄물 뒤에 있습니다.
print(tom.companyName+" Inc") ///Error saying optional is not unwrapped.
print(tom.companyName!+" Inc") ///Error Gone..we have forcefully unwrap it which is wrong approach..Will look in Next line
print(bob.companyName!+" Inc") ///Crash!!!because bob has no company and nil can be unwrapped.
이제 선택사항이 적용되는 이유를 살펴보겠습니다.
if let companyString:String = bob.companyName{///Compiler safely unwrap company if not nil.If nil,no unwrap.
print(companyString+" Inc") //Will never executed and no crash!!!
}
bobtom
if let companyString:String = tom.companyName{///Compiler safely unwrap company if not nil.If nil,no unwrap.
print(companyString+" Inc") //Will executed and no crash!!!
}
축하드립니다! 우리는 제대로 대처했습니다.optional?
실현 포인트는
- 합니다.
nil - 를 코드 , 그 시켜 줍니다.이 변수에 「」가 포함되어 있는 는, 「」로 .
nil.
감사합니다.해피 코딩
아래 코드 Playground로 실험해 보겠습니다.선택 사항 및 사용 이유를 명확히 해 주셨으면 합니다.
var sampleString: String? ///Optional, Possible to be nil
sampleString = nil ////perfactly valid as its optional
sampleString = "some value" //Will hold the value
if let value = sampleString{ /// the sampleString is placed into value with auto force upwraped.
print(value+value) ////Sample String merged into Two
}
sampleString = nil // value is nil and the
if let value = sampleString{
print(value + value) ///Will Not execute and safe for nil checking
}
// print(sampleString! + sampleString!) //this line Will crash as + operator can not add nil
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html 에서 :
옵션 체인은 현재 제로일 수 있는 옵션 속성, 메서드 및 서브스크립트를 조회하고 호출하는 프로세스입니다.옵션에 값이 포함되어 있는 경우 속성, 메서드 또는 서브스크립트콜이 성공합니다.옵션 값이 0일 경우 속성, 메서드 또는 서브스크립트콜은 0을 반환합니다.여러 쿼리를 체인으로 연결할 수 있으며 체인 내의 링크가 제로일 경우 체인 전체가 정상적으로 실패합니다.
자세한 내용은 위의 링크를 참조하십시오.
뭐...
? (임의) 변수는 0 값을 포함할 수 있음을 나타냅니다.또한 ! (unwrapper)는 변수가 런타임에 사용될 때 메모리(또는 값)가 있어야 함을 나타냅니다.
주된 차이점은 옵션의 체인은 옵션이 0일 때 정상적으로 실패하는 반면 강제 언랩핑은 옵션이 0일 때 실행 시 오류를 발생시킨다는 것입니다.
옵션 체인을 0 값으로 호출할 수 있다는 사실을 반영하기 위해 쿼리하는 속성, 메서드 또는 서브스크립트가 비옵션 값을 반환하더라도 옵션체인 호출 결과는 항상 옵션 값입니다.이 옵션 반환값을 사용하여 옵션 체인콜이 성공했는지(반환된 옵션에는 값이 포함되어 있는지) 또는 체인 내의 값이 제로이기 때문에 성공하지 않았는지(반환된 옵션값은 제로)를 확인할 수 있습니다.
구체적으로는 옵션 체인콜의 결과는 예상되는 반환값과 같은 타입이지만 옵션으로 둘러싸여 있습니다.일반적으로 Int를 반환하는 속성은 선택적 체인을 통해 액세스하면 Int?를 반환합니다.
var defaultNil : Int? // declared variable with default nil value
println(defaultNil) >> nil
var canBeNil : Int? = 4
println(canBeNil) >> optional(4)
canBeNil = nil
println(canBeNil) >> nil
println(canBeNil!) >> // Here nil optional variable is being unwrapped using ! mark (symbol), that will show runtime error. Because a nil optional is being tried to get value using unwrapper
var canNotBeNil : Int! = 4
print(canNotBeNil) >> 4
var cantBeNil : Int = 4
cantBeNil = nil // can't do this as it's not optional and show a compile time error
다음은 Apple Developer Committee의 기본 튜토리얼입니다.체인(옵션)
Swift의 옵션에는 값을 포함할 수도 있고 값을 포함하지 않을 수도 있는 유형이 있습니다.옵션은 임의의 유형에 ?를 추가하여 작성합니다.
var name: String?
상세한 것에 대하여는, 다음의 링크를 참조해 주세요.https://medium.com/ @agoiabeladeyemi / options - in - parames - 2b 141 f12f870
설정되지 않은 값을 사용하려고 하는 사람들에 의해 발생하는 오류가 많습니다.때로는 크래시가 발생할 수 있습니다.객관적인 c에서는 제로 오브젝트 참조 메서드를 호출하려고 해도 무시되기 때문에 일부 코드가 실행되지 않고 컴파일러나 기술된 코드가 이유를 알 수 없습니다.옵션 인수는 영이 될 수 없는 변수를 가질 수 있습니다.또한 이 인수를 빌드하려고 하면 컴파일러는 코드를 실행할 기회가 생기기 전에 사용자에게 통지하거나 오브젝트가 정의되지 않는 것이 적절한지 판단할 수 있습니다.그러면 컴파일러는 이를 고려하지 않은 것을 기술하려고 할 때 사용자에게 통지할 수 있습니다.
no 오브젝트를 호출하는 경우는, 그대로 실행해 주세요.
object?.doSomthing()
컴파일러 및 코드를 읽는 본인에게 가능한 오브젝트는 제로이며 아무 일도 일어나지 않음을 명시했습니다.값이 존재하는 경우에만 발생시키고 싶은 코드 행이 몇 개 있을 수 있으므로 다음을 수행할 수 있습니다.
if let obj = object {
obj.doSomthing()
doSomethingto(obj)
}
이 두 문은 객체가 무엇인 경우에만 실행됩니다. 마찬가지로, 이것이 무엇인가가 아닌 경우 나머지 코드 블록 전체를 중지하는 것이 좋습니다.
guard let obj = object {
return
}
obj.doSomthing()
doSomethingto(obj)
이것은 오브젝트가 무엇인가일 경우에만 그 이후의 모든 것을 적용할 수 있는 경우에 보다 간단하게 읽을 수 있습니다.또 다른 가능성은 기본값을 사용하는 것입니다.
let obj = object ?? <default-object>
obj.doSomthing()
doSomethingto(obj)
이제 obj는 유형에 대한 기본값인 경우에도 할당됩니다.
options는 어떤 이벤트가 발생할 때까지 값이 취득되지 않을 가능성이 있는 경우나, 관련성이 없어졌거나 다시 설정할 필요가 있다고 하는 방법으로 옵션을 0으로 설정하는 것을 사용할 수 있는 경우에 편리합니다.또, 이 옵션을 사용하는 모든 것은, 설정될 때까지 그 값을 사용해 아무것도 할 필요가 없습니다.내가 옵션들을 사용하는 한 가지 방법은 뭔가 해야 한다거나 이미 끝났다고 말하는 것이다.
func eventFired() {
guard timer == nil else { return }
timer = scheduleTimerToCall(method, in: 60)
}
func method() {
doSomthing()
timer = nil
}
이 sudo 코드는 eventFured를 여러 번 호출할 수 있지만 타이머가 스케줄링된 것은 첫 번째 호출뿐입니다.일정이 실행되면 어떤 메서드가 실행되고 타이머가 다시0으로 설정되므로 다른 타이머를 스케줄링할 수 있습니다.
변수가 정의되지 않은 상태에 있다는 것을 이해하게 되면 모든 것에 사용할 수 있습니다.
아주 간단해요.옵션(Swift에서)은 변수/상수가 null일 수 있음을 의미합니다.코틀린 언어는 같은 것을 구현하지만 결코 그것을 '옵션'이라고 부르지 않는다는 것을 알 수 있다.예를 들어 다음과 같습니다.
var lol: Laugh? = nil
Kotlin에서는 다음과 같습니다.
var lol: Laugh? = null
또는 Java에서는 다음과 같습니다.
@Nullable Laugh lol = null;
예에서는 '우리'를 사용하지 않을 ,?★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 그러면 오류가 발생합니다.물음표는 변수/상수가 null일 수 있음을 의미하기 때문에 임의라고 불립니다.
다음은 Swift에서 이와 동등한 옵션 선언입니다.
var middleName: String?
이 선언은 string 유형의 middleName이라는 변수를 만듭니다.String 변수 유형 뒤의 물음표(?)는 middleName 변수에 String 또는 0 중 하나의 값을 포함할 수 있음을 나타냅니다.이 코드를 보면 middleName이 0일 수 있다는 것을 금방 알 수 있습니다.자기 기록이야!
옵션 상수 또는 변수(위 그림 참조)에 초기 값을 지정하지 않으면 값이 자동으로 0으로 설정됩니다.필요에 따라서, 초기치를 명시적으로 0 으로 설정할 수 있습니다.
var middleName: String? = nil
자세한 내용은 아래 링크를 참조하십시오.
http://www.iphonelife.com/blog/31369/swift-101-working-swifts-new-optional-values
언급URL : https://stackoverflow.com/questions/24003642/what-is-an-optional-value-in-swift
'programing' 카테고리의 다른 글
| 데이터를 덮어쓰지 않고 기존 Excel 파일에 쓰는 방법(팬더 사용) (0) | 2023.04.27 |
|---|---|
| 현재 작업 디렉토리가 아닌 파일 위치에 기반한 상대 경로 (0) | 2023.04.22 |
| Excel 또는 스프레드시트 열 문자를 피토닉 방식으로 숫자로 변환 (0) | 2023.04.22 |
| UIScrollView를 프로그래밍 방식으로 맨 아래로 스크롤합니다. (0) | 2023.04.22 |
| "PowerShell 호스트를 초기화하지 못했습니다"로 인해 nuget 패키지를 설치할 수 없습니다. (0) | 2023.04.22 |
