programing

느낌표는 스위프트 언어로 무엇을 의미합니까?

powerit 2023. 4. 28. 21:42
반응형

느낌표는 스위프트 언어로 무엇을 의미합니까?

Swift Programming Language 가이드의 예는 다음과 같습니다.

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { println("\(name) is being deinitialized") }
}

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    var tenant: Person?
    deinit { println("Apartment #\(number) is being deinitialized") }
}

var john: Person?
var number73: Apartment?

john = Person(name: "John Appleseed")
number73 = Apartment(number: 73)

//From Apple's “The Swift Programming Language” guide (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)

그런 다음 아파트를 사용자에게 할당할 때 느낌표를 사용하여 "인스턴스 포장을 해제"합니다.

john!.apartment = number73

인스턴스를 "랩 해제"하는 것은 무엇을 의미합니까?왜 그것이 필요합니까?다음을 수행하는 것과 어떻게 다릅니까?

john.apartment = number73

저는 스위프트 언어가 아주 생소합니다.그냥 기본적인 것들을 이해하려고 노력하는 중입니다.



제가 놓친 퍼즐의 큰 부분은 (답변에 직접적으로 언급되지 않았습니다 - 적어도 이 글을 쓸 당시에는 그렇지 않았습니다) 여러분이 다음을 할 때입니다.

var john: Person?

그렇다고 해서 "라는 것을 의미하지 않습니다.john이 형의입니다.Person원래 생각했던 것처럼 0이 될 수도 있습니다."나는 단지 그것을 오해하고 있었습니다.Person그리고.Person?완전히 별개의 유형입니다.내가 그걸 파악하고 나면, 다른 모든 사람들?,!광기, 그리고 아래의 훌륭한 대답들은 훨씬 더 말이 되었습니다.

인스턴스를 "랩 해제"하는 것은 무엇을 의미합니까?왜 그것이 필요합니까?

제가 할 수 있는 한 (이것도 저에게는 매우 새로운 것입니다)...

"포장"이라는 용어는 (슬프게도!) 비어 있을 수 있는 빛나는 종이에 싸인 선택적 변수를 선물로 생각해야 한다는 것을 의미합니다.

" 때 은 두 한 값값과 유사)을 입니다."랩"된 경우 옵션 변수의 값은 두 개의 가능한 값(부울 값과 약간 유사)을 가진 열거형입니다..Some(T)) 또는 그렇지 않음(None).

수 .TSome(T)).

어떻게 있다.john!.apartment = number73는 다른john.apartment = number73단락)

변수의 을 작성하는 경우(예: 텍스트 예쓰는경우을름이의옵수텍트션변스)john 없이!), "랩된" 열거형을 그렇게john의 예가 Person그고그없습다니은것리▁an다'가 없습니다.apartment구성원:

john.apartment
// 'Person?' does not have a member named 'apartment'

실제.Person값은 다양한 방법으로 래핑 해제할 수 있습니다.

  • 포장 풀기 "강제포장풀기:"":john!((으)로 Person존재하면 0이면 런타임 오류가 발생합니다.
  • 바인딩 " 택적바인딩선":if let p = john { println(p) }((으)로 println값이 존재하는 경우)
  • 체인 "택적체인선:":john?.learnAboutSwift()이 존재하는 이

저는 여러분이 이러한 방법 중 하나를 선택하여 포장을 벗길 것이라고 생각합니다. 0의 경우에 어떤 일이 발생해야 하는지, 그리고 얼마나 가능성이 있는지에 따라 달라집니다.이 언어 설계는 nil 사례를 명시적으로 처리하도록 강제하며, 이는 Obj-C(nil 사례를 처리하는 것을 잊기 쉬운 곳)보다 안전성을 향상시킨다고 생각합니다.

업데이트:

느낌표는 "암시적으로 래핑되지 않은 옵션"을 선언하는 구문에도 사용됩니다.

에서, 까지의예들서에지금,서▁the예,john이 변가다선습니다었으로 되었습니다.var john:Person? 값을 하여 변수의 값을 .변수의 실제 값을 얻으려면 위의 세 가지 방법 중 하나를 사용하여 변수의 포장을 풀어야 합니다.

▁로 선언된 경우var john:Person!대신 변수는 Implicitly Unlapped Optional(임의적으로 포장되지 않은 옵션)입니다(Apple의 책에서 이 제목이 있는 섹션 참조).값에 액세스할 때 이러한 종류의 변수를 풀 필요가 없습니다.john추가 구문 없이 사용할 수 있습니다.하지만 애플의 책은 이렇게 말합니다.

나중에 변수가 0이 될 가능성이 있는 경우 암묵적으로 랩 해제 옵션을 사용하지 마십시오.변수의 수명 동안 0 값을 확인해야 하는 경우에는 항상 일반 선택 유형을 사용합니다.

업데이트 2:

Mike Ash의 "Interesting Swift Features" 기사는 선택적 유형에 대한 약간의 동기를 제공합니다.저는 그것이 훌륭하고 명확한 글이라고 생각합니다.

업데이트 3:

느낌표에 대한 암묵적으로 포장되지 않은 선택적 사용에 대한 또 다른 유용한 기사: Chris Adamson의 "Swift and the Last Mile".기사는 이것이 애플이 목표-C 프레임워크에 사용되는 0을 포함할 수 있는 유형을 선언하는 데 사용된 실용적인 조치라고 설명합니다.유형을 선택사항으로 선언(사용)? 암묵적으로 (으로 또는사포해제장(으로) 사용)!입니다.". "안전과 편의의 절충"입니다.기사에 제공된 예에서 Apple은 유형을 암시적으로 포장 해제된 것으로 선언하여 호출 코드를 더 편리하게 만들지만 안전하지는 않습니다.

아마도 Apple은 미래에 암묵적으로 포장되지 않은 ("아마도 never never") 매개변수의 불확실성을 제거하고 선택적("반드시 never never!") 선언이나 표준 비선택적("never never") 선언으로 대체할 것입니다.그들의 목표-C 코드의 정확한 행동에 근거합니다.

제가 생각하는 차이점은 다음과 같습니다.

var john: Person?

존이 0일 수 있음을 의미합니다.

john?.apartment = number73

컴파일러는 이 행을 다음과 같이 해석합니다.

if john != nil {
    john.apartment = number73
}

하는 동안에

john!.apartment = number73

컴파일러는 이 행을 단순하게 해석합니다.

john.apartment = number73

따서라, 사용을 합니다.!if 문의 랩을 해제하고 더 빨리 실행되도록 하지만 john이 0이면 런타임 오류가 발생합니다.

여기서 랩은 메모리가 랩된다는 것을 의미하는 것이 아니라 코드 랩이라는 것을 의미합니다. 이 경우 if 문으로 랩됩니다. 그리고 Apple이 런타임의 성능에 주의를 기울이기 때문에 가능한 최고의 성능으로 앱을 실행할 수 있는 방법을 제공하고자 합니다.

업데이트:

4년 만에 다시 이 답변으로 돌아가서, 스택 오버플로에서 가장 높은 평판을 얻었기 때문입니다 :) 저는 그때 포장을 푸는 것의 의미를 조금 오해했습니다.4년이 지난 지금, 저는 여기서 포장을 푸는 것의 의미가 원래의 컴팩트한 형태에서 코드를 확장하는 것이라고 믿습니다.또한 그것은 그 물체 주변의 모호함을 제거하는 것을 의미합니다. 왜냐하면 우리는 그것이 0인지 아닌지 정의상 확신할 수 없기 때문입니다.위의 애슐리의 대답처럼, 그것을 아무것도 포함할 수 없는 선물로 생각하세요.하지만 저는 여전히 언랩이 코드 언랩이며 열거형을 사용하는 메모리 기반 언랩이 아니라고 생각합니다.

TL;DR

느낌표는 스위프트 언어로 무엇을 의미합니까?

느낌표는 효과적으로 "나는 이 선택사항이 확실히 가치가 있다는 것을 알고 있습니다. 사용하십시오."라고 말합니다.이를 옵션 값의 강제 해제라고 합니다.

let possibleString: String? = "An optional string."
print(possibleString!) // requires an exclamation mark to access its value
// prints "An optional string."

let assumedString: String! = "An implicitly unwrapped optional string."
print(assumedString)  // no exclamation mark is needed to access its value
// prints "An implicitly unwrapped optional string."

출처: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html #//apple_ref/doc/uid/TP40014097-CH5-XID_399

존이 선택적 변수인 경우(따라서 선언됨)

var john: Person?

그러면 존이 값이 없을 수 있습니다(ObjC 용어로, 0 값).

느낌표는 기본적으로 컴파일러에게 "나는 이것이 값을 가지고 있다는 것을 알고 있으며, 당신은 그것에 대해 테스트할 필요가 없습니다."라고 말합니다.사용하지 않으려면 조건부로 테스트할 수 있습니다.

if let otherPerson = john {
    otherPerson.apartment = number73
}

이 내부는 John이 값을 가지고 있는지 여부만 평가합니다.

유용하지만 보다 세부적인 답변에 추가할 몇 가지 큰 그림 관점:

Swift에서 느낌표는 다음과 같은 여러 컨텍스트에 나타납니다.

  • 랩 : 강제포풀기장:let name = nameLabel!.text
  • 으로 랩 해제 암묵으로포해제옵션장적:var logo: UIImageView!
  • 주조: 강제주조:logo.image = thing as! UIImage
  • 되지 않은 처되지 예외은:try! NSJSONSerialization.JSONObjectWithData(data, [])

이 모든 것들은 다른 의미를 가진 다른 언어 구조이지만, 그들 모두는 세 가지 중요한 공통점을 가지고 있습니다.

느낌표는 Swift의 컴파일 타임 안전 검사를 우회합니다.

를 할 때!스위프트에서 당신은 본질적으로 이렇게 말하고 있습니다. "이봐, 컴파일러, 나는 당신이 여기서 오류가 발생할 수 있다고 생각하는 것을 알지만, 나는 그것이 절대 일어나지 않을 것이라는 것을 완전히 확신합니다."

모든 유효한 코드가 스위프트의 컴파일 시간 유형 시스템의 상자에 들어맞는 것은 아니며, 이 경우 모든 언어의 정적 유형 검사가 해당됩니다.오류가 발생하지 않는다는 것을 논리적으로 증명할 수 있지만 컴파일러에게 증명할 수 없는 상황이 있습니다.그것이 스위프트의 디자이너들이 애초에 이러한 특징들을 추가한 이유입니다.

, 이 그나사때다를 사용할 !오류에 대한 복구 경로가 필요하지 않습니다. 즉, 다음과 같습니다.

느낌표는 잠재적 충돌입니다.

느낌표는 또한 "Swift, 나는 이 오류가 절대 발생할 수 없다고 확신하기 때문에 가 복구 경로를 코딩하는 것보다 내 전체 앱을 손상시키는 것이 더 낫습니다."라고 말합니다.

그것은 위험한 주장입니다.그것은 올바른 것일 수 있습니다. 코드의 불변성에 대해 열심히 생각해 본 미션 크리티컬 코드에서는 가짜 출력이 충돌보다 더 나쁠 수 있습니다.

저는 하만지를 보면 때봤을가가 나옵니다.!야생에서, 그것은 그렇게 신중하게 사용되는 경우가 거의 없습니다.대신에, 그것은 너무 자주 의미합니다, "이 값은 선택적이었고 나는 왜 그것이 0이 될 수 있는지 또는 그 상황을 적절하게 처리하는 방법에 대해 너무 열심히 생각하지 않았지만, 추가합니다.!컴파일을 완료했습니다. 그래서 제 코드가 정확하죠?"

느낌표의 오만함을 조심하세요.대신에…

느낌표는 적게 사용하는 것이 가장 좋습니다.

것들이!이 있습니다.?오류/오류 사례를 처리하도록 강요하는 상대방:

  • 래핑 : 조부래핑해제:if let name = nameLabel?.text { ... }
  • 사항: 선택사:var logo: UIImageView?
  • 캐스트: 조부주조건:logo.image = thing as? UIImage
  • 고시 로예 외제:try? NSJSONSerialization.JSONObjectWithData(data, [])

사용하고 싶은 경우!왜 당신이 사용하지 않는지 신중하게 고려하는 것은 항상 좋습니다.?대신.당신의 프로그램을 파괴하는 것은 정말 최고의 옵션입니다. 만약 그렇다면.!작업 실패?이 값이 선택적/실패 가능한 이유는 무엇입니까?

nill/error 사례에서 코드가 취할 수 있는 적절한 복구 경로가 있습니까?그렇다면 코드화합니다.

0이 될 수 없다면, 오류가 절대 발생할 수 없다면, 컴파일러가 그것을 알 수 있도록 논리를 재작업할 수 있는 합리적인 방법이 있습니까?그렇다면 그렇게 하십시오. 코드가 오류 발생 가능성이 줄어듭니다.

오류를 처리할 수 있는 합리적인 방법이 없는 경우가 있으며, 오류를 무시하고 잘못된 데이터를 처리하는 것이 충돌보다 더 나쁠 수 있습니다. 때는 강제로 포장을 풀 때입니다.

에서 정적으코전검색를여하스이를 합니다.! 그리고 그것의 모든 사용을 감사합니다.극소수의 사용만이 정밀 조사를 견뎌낼 수 있습니다.(이 글을 쓰는 시점에서, 전체 시에스타 프레임워크는 정확히 두 개의 인스턴스를 가지고 있습니다.)

그렇다고 절대로 사용해서는 안 된다는 것은 아닙니다.!사용자의 코드에서 이 옵션을 기본 옵션으로 지정하지 않고 신중하게 사용해야 합니다.

john는 선택 인 " 선사니다입항는"입니다.var그리고 그것은 포함할 수 있습니다.nilvalue.하려면 값을 합니다. 값이 0이 아닌지 확인하려면 다음을 사용합니다.!varhttp://///t.

설명서에서

"선택사항에 값이 포함되어 있는지 확인한 후 선택사항 이름 끝에 느낌표(!)를 추가하여 기본값에 액세스할 수 있습니다.느낌표는 효과적으로 "나는 이 선택사항이 확실히 가치가 있다는 것을 알고 있습니다. 사용하십시오."라고 말합니다.

non-non-lin 값을 확인하는 또 다른 방법은 (옵션으로 래핑 해제)입니다.

    if let j = json {
        // do something with j
    }

다음은 몇 가지 예입니다.

var name:String = "Hello World"
var word:String?

에▁where디word는 선택적인 값입니다. 즉, 값을 포함하거나 포함하지 않을 수 있습니다.

word = name 

여기서name할 수 .

var cow:String = nil
var dog:String!

에▁where디dog force 합니다.

dog = cow

할당되었기 때문에 응용 프로그램이 충돌합니다.nil

이 경우에는...

var John: 사람!

즉, 처음에는 John이 0 값을 갖게 되고, 설정된 후에는 다시는 0 값을 갖지 않게 됩니다.따라서 "암시적으로 랩 해제된 선택사항"이기 때문에 선택적인 var에 접근하기 위한 더 쉬운 구문을 사용할 수 있습니다.

C 계열 언어에서 온 경우 "메모리 주소 0(NULL)일 수 있는 유형 X의 개체에 대한 포인터"라고 생각할 것이고, 동적으로 입력된 언어에서 온 경우 "유형 X이지만 유형 정의되지 않은 개체"라고 생각할 것입니다.이 두 가지 모두 실제로는 정확하지 않습니다. 하지만 우회적으로 말하면 첫 번째 것은 가깝습니다.

당신이 그것을 생각해야 하는 방법은 다음과 같은 물체와 같습니다.

struct Optional<T> {
   var isNil:Boolean
   var realObject:T
}

테할때트로 foo == nil정말 돌아오고 있습니다.foo.isNil그리고 당신이 말할 때foo!돌아오고 ㅠㅠㅠㅠㅠfoo.realObject라는 foo.isNil == false주의할 점은 만약에foo 0을 할 이 됩니다.foo!이는 런타임 오류이므로 값이 0이 아닐 것이라는 확신이 서지 않는 한 일반적으로 조건부 문자를 대신 사용합니다.이런 종류의 속임수는 언어가 모든 곳에서 값이 0인지 테스트하도록 강요하지 않고 강하게 입력될 수 있다는 것을 의미합니다.

실제로는 컴파일러가 작업을 수행하기 때문에 실제로 그렇게 작동하지 않습니다.높은 수준에서 유형이 있습니다.Foo?그것과는 별개의 것Foo그리고 그것은 유형을 수용하는 펑스를 방지합니다.Foo값을 메서드가 nil ▁which▁▁test▁▁from▁value▁pointer▁isn▁null▁value▁is▁the▁optional,▁a▁by▁an▁because아▁may개▁it▁receiving-니닙▁but다'가체실▁a제▁at▁it▁level▁nil▁that)에▁fact▁in때▁a▁low문;s▁itties▁or기없가▁likely 실제로 강제로 래핑을 해제할 때 NULL(0)에 의해 적절한 테스트를 수행할 수 있는 포인터일 가능성이 높습니다.

느낌표가 표시되는 다른 상황은 다음과 같이 유형에 있습니다.

func foo(bar: String!) {
    print(bar)
}

이는 강제 언랩이 있는 옵션을 수락하는 것과 거의 같습니다. 예를 들어, 다음과 같습니다.

func foo(bar: String?) {
    print(bar!)
}

이를 사용하여 선택적 값을 기술적으로 허용하지만 0인 경우 런타임 오류가 발생하는 메서드를 사용할 수 있습니다.현재 버전의 Swift에서는 is-not-nil 어설션을 무시하기 때문에 낮은 수준의 오류가 발생합니다.일반적으로 좋은 생각은 아니지만 다른 언어에서 코드를 변환할 때 유용할 수 있습니다.

!는 ! 뒤에 오는 객체를 강제로 풀었다는 의미입니다.자세한 내용은 Apple 설명서에서 확인할 수 있습니다. 이 문서는 https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/TheBasics.html 에서 확인할 수 있습니다.

C#에 익숙한 경우에는 물음표를 사용하여 선언되는 Nullable 유형과 같습니다.

Person? thisPerson;

이 경우 느낌표는 에 액세스하는 것과 같습니다.다음과 같은 null 형식의 값 속성:

thisPerson.Value

John은 선택적인 사용자입니다. 즉, 값을 보유하거나 0이 될 수 있습니다.

john.apartment = number73

john이 선택 사항이 아닌 경우 사용됩니다.존이 영이 아닌 적이 없기 때문에 우리는 그것이 영 값으로 아파트를 부르지 않을 것이라고 확신할 수 있습니다.하는 동안에

john!.apartment = number73

컴파일러가 John이 0이 아니라고 약속한 다음 John의 값을 가져오기 위해 옵션을 해제하고 John의 아파트 속성에 액세스합니다.만약 당신이 존이 0이 아니라는 것을 안다면 이것을 사용하세요.이 옵션을 0으로 호출하면 런타임 오류가 발생합니다.

설명서에는 convertedNumber가 선택 사항인 경우 이를 사용하는 좋은 예가 포함되어 있습니다.

if convertedNumber {
    println("\(possibleNumber) has an integer value of \(convertedNumber!)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}

값이 없는 C 변수는 'nil'과 같으므로(0과 동일한 'nil' 값을 사용할 수도 있음), 조건문에서 변수를 사용할 수 있었습니다(값이 없는 변수는 'TRUE'와 같고 값이 없는 변수는 'FALSE'와 같음).

Swift는 '옵션 값'을 제공하여 유형 안전을 제공합니다.이것은 형성된 오류가 다른 유형의 변수를 할당하는 것을 방지합니다.

따라서 Swift에서는 조건문에 부울만 제공할 수 있습니다.

var hw = "Hello World"

여기서 'hw'는 문자열이지만 목적어 C처럼 if 문에서는 사용할 수 없습니다.

//This is an error

if hw

 {..}

그러기 위해서는 다음과 같이 생성되어야 합니다.

var nhw : String? = "Hello World"

//This is correct

if nhw

 {..}

개체의 끝에 있는 !는 개체가 선택 사항이며 그렇지 않으면 0을 반환할 수 있는 경우 래핑을 해제할 것이라고 말합니다.이것은 종종 프로그램을 손상시킬 수 있는 오류를 트랩하는 데 사용됩니다.

요약(!):변수를 선언한 후 변수가 값을 보유하고 있는지 확인합니다.

let assumedString: String! = "Some message..."
let implicitString: String = assumedString

그렇지 않으면 값을 전달한 후에 매번 이 작업을 수행해야 합니다.

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark

Google 사용자:

john!.department

...슬립 컴파일러:

  • 알고있어요john선택 사항입니다.
  • 가치가 있는 것처럼 사용합니다.
  • 그렇지 않으면 충돌하십시오.

시에는 운영환서사용에를 합니다.guard let또는if let가치가 없는 상황을 처리하고 하드 충돌을 방지합니다.

쉽게 말해, 느낌표는 옵션의 포장을 풀고 있다는 것을 의미합니다.선택 사항은 값을 가질 수 있는지 여부를 나타내는 변수입니다. 따라서 여기에 나와 있는 것처럼 iflet 문을 사용하여 변수가 비어 있는지 확인한 다음 강제로 래핑을 해제할 수 있습니다.그러나 빈 옵션을 강제로 풀면 프로그램이 중단되므로 주의하십시오!옵션은 변수에 대한 명시적 할당의 끝에 물음표를 붙여 선언합니다. 예를 들어 다음과 같이 쓸 수 있습니다.

var optionalExample: String?

이 변수에는 값이 없습니다.제가 포장을 풀면 프로그램이 중단되고 Xcode는 당신이 0의 값을 가진 옵션을 풀려고 했다고 말할 것입니다.

도움이 되었기를 바랍니다.

간단히 말하면

느낌표 사용은 변수가 0이 아닌 값으로 구성되어야 함을 나타냅니다(영이 아닐 수 없음).

전체 이야기는 선택적 변수라는 swift 기능으로 시작합니다.값을 가질 수도 있고 값을 가질 수도 있는 변수입니다.일반적으로 swift는 초기화되지 않은 변수를 사용하는 것을 허용하지 않습니다. 이는 충돌이나 예상치 못한 이유를 초래할 수 있으며 백도어용 자리 표시자를 서버로 사용할 수도 있기 때문입니다.따라서 처음에 값이 결정되지 않은 변수를 선언하기 위해 '?'를 사용합니다.이러한 변수가 선언될 때, 사용하기 전에 해당 변수의 랩을 해제해야 하는 식의 일부로 사용하기 위해 랩 해제는 변수의 값이 검색되는 작업입니다. 이 작업은 개체에 적용됩니다.포장을 풀지 않으면 컴파일 시간 오류가 발생합니다.선택적 변수인 변수의 래핑을 해제하려면 느낌표 "!"를 사용합니다.

이제는 그러한 선택적 변수가 시스템이나 자신의 프로그램 등에 의해 값이 할당된다는 것을 알 때가 있지만, 나중에 예를 들어 UI 아울렛과 같은 상황에서는 물음표 "?"를 사용하여 선택적 변수를 선언하는 대신 "!"를 사용합니다.

따라서 시스템은 "!"로 선언된 이 변수가 현재 선택 사항이며 값이 없지만 수명 후반에 값을 수신한다는 것을 알고 있습니다.

따라서 느낌표는 두 가지 용도로 사용됩니다. 1.변수를 선언합니다. 변수는 선택 사항이며 나중에 반드시 값을 받게 됩니다. 2.식에서 사용하기 전에 선택적 변수의 랩을 해제합니다.

위의 설명들은 너무 많은 기술적인 것들을 피하기를 바랍니다.

선택사항으로 사용하면 선택사항의 포장을 풀고 해당 항목이 있는지 확인합니다.if-else 문에서 사용하는 경우는 NOT의 코드입니다.예를들면,

if (myNumber != 3){
 // if myNumber is NOT 3 do whatever is inside these brackets.
)

선택적 변수는 값을 포함하거나 포함하지 않을 수 있습니다.

1: 사례 1:var myVar:String? = "Something"

2: 사례 2:var myVar:String? = nil

이 myVar!라고 , 이 제이당이 myVar!를 반환할 입니다.에게 묻는다면, 당신은 컴파일러에게 1이 반환될 경우 값을 반환하라고 말하는 것입니다."Something"

2번 경우 그것은 충돌할 것입니다.

의미! 표시는 컴파일러가 값을 반환하지 않더라도 강제로 반환합니다.포스 언랩이라는 이름이 붙은 이유입니다.

Simple the Optional variable allows nil to be stored.

var str : String? = nil

str = "Data"

To convert Optional to the Specific DataType, We unwrap the variable using the keyword "!"

func get(message : String){
   return
}

get(message : str!)  // Unwapped to pass as String

자신에게 물어보아라.

  • 유형에 다음이 있습니까?apartment회원/회원?OR
  • 유형에 다음이 있습니까?apartment회원/회원?

이 질문에 대답할 수 없는 경우 다음을 계속 읽으십시오.

이해하려면 Generics에 대한 초기본 수준의 이해가 필요할 수 있습니다.여기 보세요.스위프트의 많은 것들은 제네릭을 사용하여 작성됩니다.옵션 포함

아래 코드는 이 Stanford 비디오에서 사용할 수 있게 되었습니다.처음 5분을 시청하는 것을 강력히 추천합니다.

선택사항은 두 개의 대소문자만 포함된 열거형입니다.

enum Optional<T>{
    case None
    case Some(T)
}

let x: String? = nil //actually means:

let x = Optional<String>.None

let x :String? = "hello" //actually means:

let x = Optional<String>.Some("hello")

var y = x! // actually means:

switch x {
case .Some(let value): y = value
case .None: // Raise an exception
}

선택적 바인딩:

let x:String? = something
if let y = x {
    // do something with y
}
//Actually means:

switch x{
case .Some(let y): print)(y) // or whatever else you like using 
case .None: break
}

이 하면고라고 때var john: Person?당신은 실제로 다음과 같은 것을 의미합니다.

enum Optional<Person>{
case .None
case .Some(Person)
}

위 열거형에 이름이 지정된 속성이 있습니까?apartment어디서 보십니까?그것은 전혀 없습니다!하지만 당신이 포장을 벗기면,person!그러면 당신은...후드 아래에서 작동하는 기능은 다음과 같습니다.Optional<Person>.Some(Person(name: "John Appleseed"))


정의되었습니까?var john: Person 다음대신:var john: Person?그러면 당신은 더 이상 그것을 가질 필요가 없었을 것입니다.! 용사, 하면냐왜.Person그 자체가 회원을 가지고 있습니다.apartment


하는이유대향논로의후를 사용하는지에 로서.!포장을 푸는 것은 때때로 권장되지 않습니다. 이 Q&A를 참조하십시오.

언급URL : https://stackoverflow.com/questions/24018327/what-does-an-exclamation-mark-mean-in-the-swift-language

반응형