Swift에서 "포장되지 않은 가치"란 무엇입니까?
이 튜토리얼에 따라 iOS 8/OSX 10.10용 Swift를 배우고 있으며, 이 단락(Objects and Class)에서와 같이 "unwraped value"라는 용어가 여러 번 사용됩니다.
옵션 값으로 작업할 경우 메서드, 속성 및 첨자 작성과 같은 작업 전에 ?을 쓸 수 있습니다.? 앞의 값이 0일 경우 ? 뒤의 모든 값은 무시되고 식 전체의 값은 0이 됩니다.그렇지 않으면 옵션 값이 래핑 해제되고 이후의 모든 것이 래핑 해제된 값에 적용됩니다.두 경우 모두 식 전체의 값은 옵션 값입니다.
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare?.sideLength
이해가 안 돼서 인터넷 검색을 했는데 잘 안 되더라고요.
이게 무슨 뜻이죠?
편집
Cezary의 답변에 따르면 원래 코드의 출력과 최종 솔루션(플레이그라운드에서 테스트) 사이에는 약간의 차이가 있습니다.
오리지널 코드
세자리의 해법
두 번째 경우 출력에 슈퍼클래스의 속성이 표시되고 첫 번째 경우 빈 객체가 표시됩니다.
결과는 두 경우 모두 동일해야 하는 것 아닌가요?
먼저 옵션 유형이 무엇인지 이해해야 합니다.옵션 타입은 기본적으로 변수가 다음과 같이 될 수 있음을 의미합니다. nil
.
예:
var canBeNil : Int? = 4
canBeNil = nil
는 '하다'라는.canBeNil
수 있습니다.nil
.
이것은 동작하지 않습니다.
var cantBeNil : Int = 4
cantBeNil = nil // can't do this
옵션인 경우 변수에서 값을 가져오려면 래핑을 해제해야 합니다.이것은 단지 마지막에 느낌표를 넣는 것을 의미합니다.
var canBeNil : Int? = 4
println(canBeNil!)
코드는 다음과 같습니다.
let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare!.sideLength
사이드노트:
물음표 대신 느낌표를 사용하여 자동으로 래핑을 풀 수 있는 옵션을 선언할 수도 있습니다.
예:
var canBeNil : Int! = 4
print(canBeNil) // no unwrapping needed
따라서 코드를 수정하는 다른 방법은 다음과 같습니다.
let optionalSquare: Square! = Square(sideLength: 2.5, name: "optional square")
let sideLength = optionalSquare.sideLength
편집:
여기서 볼 수 있는 차이는 옵션 값이 랩되어 있다는 사실의 증상입니다.그 위에 또 다른 층이 있어요.포장되지 않은 버전은 포장되지 않은 상태이기 때문에 스트레이트 오브젝트를 보여줍니다.
간단한 놀이터 비교:
와 두 에 2개의 레이어)가 됩니다.{{...}}
밖에 표시되지 3개의 레이어{...}
오브젝트가 자동으로 래핑 해제되기 때문입니다.
번째 와 두 은 두 시 입니다.optionalSquare
로 설정되어 있다.nil
할 수.
if let sideLength = optionalSquare?.sideLength {
println("sideLength is not nil")
} else {
println("sidelength is nil")
}
기존의 정답은 훌륭하지만, 이것을 완전히 이해하기 위해서는 매우 추상적이고 이상한 개념이기 때문에 좋은 유추법이 필요하다는 것을 알게 되었습니다.
그래서 저는 정답 외에 다른 관점을 제시함으로써 우뇌(시각적 사고) 개발자들을 돕겠습니다.여기 나에게 많은 도움을 준 좋은 비유가 있다.
생일 선물 포장 비유
선택사항은 딱딱하고 딱딱한 색상의 포장으로 제공되는 생일 선물과 같다고 생각하세요.
선물 포장을 뜯을 때까지 포장 안에 무엇이 들어 있는지 알 수 없습니다.아마 포장 안에는 아무것도 들어 있지 않을 것입니다.만약 안에 무엇이 있다면, 그것은 또 다른 선물일 수도 있고, 포장되어 있고, 아무것도 들어 있지 않을 수도 있다.당신은 포장된 선물 100개를 풀어서 마침내 포장된 것 외에는 아무것도 없다는 것을 알게 될 것이다.
이 ""가 경우"nil
이 때, 당신은 무언가가 들어 있는 상자를 드러냈습니다.단, 특히 값이 명시적으로 입력되지 않고 미리 정의된 상수가 아닌 변수인 경우 상자 안에 무엇이 있는지, 유형 또는 실제 값이 무엇인지에 대해 구체적으로 알기 전에 상자를 열어야 할 수 있습니다.
상자 안에 무엇이 들어있나요?!유추
변수를 푼 후에도 당신은 여전히 SE7EN의 마지막 장면에 나오는 브래드 피트와 같다.왜냐하면 당신이 선물을 푼 후에도 당신은 다음과 같은 상황에 처해 있기 때문이다: 당신은 지금 무언가를 담고 있는 상자를 가지고 있기 때문이다.
어떤 종류인지 아실 거예요.예를 들어 변수를 유형으로 선언한 경우[Int:Any?]
그러면 모든 오래된 유형의 래핑된 내용을 생성하는 정수 첨자가 있는 (빈) 사전이 있다는 것을 알 수 있습니다.
그렇기 때문에 Swift에서 컬렉션 타입(Dictionary and Arrays)을 취급하는 것은 다소 번거로울 수 있습니다.
적절한 예:
typealias presentType = [Int:Any?]
func wrap(i:Int, gift:Any?) -> presentType? {
if(i != 0) {
let box : presentType = [i:wrap(i-1,gift:gift)]
return box
}
else {
let box = [i:gift]
return box
}
}
func getGift() -> String? {
return "foobar"
}
let f00 = wrap(10,gift:getGift())
//Now we have to unwrap f00, unwrap its entry, then force cast it into the type we hope it is, and then repeat this in nested fashion until we get to the final value.
var b4r = (((((((((((f00![10]! as! [Int:Any?])[9]! as! [Int:Any?])[8]! as! [Int:Any?])[7]! as! [Int:Any?])[6]! as! [Int:Any?])[5]! as! [Int:Any?])[4]! as! [Int:Any?])[3]! as! [Int:Any?])[2]! as! [Int:Any?])[1]! as! [Int:Any?])[0])
//Now we have to DOUBLE UNWRAP the final value (because, remember, getGift returns an optional) AND force cast it to the type we hope it is
let asdf : String = b4r!! as! String
print(asdf)
Swift는 타입의 안전성에 높은 비중을 두고 있습니다.스위프트 언어 전체는 안전을 염두에 두고 설계되었습니다.그것은 스위프트의 특징 중 하나이며 두 팔을 벌려 환영해야 할 것이다.깔끔하고 읽기 쉬운 코드를 개발하는 데 도움이 되며 응용 프로그램의 크래시를 방지합니다.
은 Swift로 됩니다.?
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?
옵션으로서 선언하고 있는 타입의 이름 뒤에, 기본적으로는, 이 타입을 의 앞에 있는 타입으로서 캐스팅 하는 것이 아닙니다.?
옵션 유형으로 지정합니다.
: 또는 : " " " " " " "
Int
같지 않다Int?
서로 수술할 수 없는 두 가지 다른 유형입니다.
옵션 사용
var myString: String?
myString = "foobar"
이것은, 다음의 타입으로 작업하고 있는 것은 아닙니다.String
아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.String?
(String Optional ' 옵션 문자열).하려고 할 때 마다, 여러분은 ,
print(myString)
시 에 " " " 가 됩니다.Optional("foobar")
. " "Optional()
는 이 에 실행 시 없을 수도 , "라는 문자열이 되어 있습니다.part는 "foobar"입니다 "'은Optional()
「옵션의 값을 「랩핑」하지 않는 한, 표시는 유지됩니다.
옵션의 래핑을 해제하면, 그 타입이 비옵션으로 캐스팅 됩니다.그러면 새 유형이 생성되고 해당 옵션 내에 있던 값이 새 비옵션 유형에 할당됩니다.이렇게 하면 컴파일러에 의해 확실한 값이 보장되므로 해당 변수에 대한 연산을 수행할 수 있습니다.
조건부로 포장을 해제하면 옵션의 값이nil
그렇지 않으면.가 아닌 경우nil
새로운 상수 변수가 생성되어 값이 할당되어 옵션 이외의 상수로 언랩됩니다.여기서부터, 의 비옵션 기능을 안전하게 사용할 수 있습니다.if
참고: 조건부로 래핑 해제된 상수에 래핑 해제 중인 옵션 변수와 동일한 이름을 지정할 수 있습니다.
if let myString = myString {
print(myString)
// will print "foobar"
}
옵션 값에 0 값이 포함되어 있으면 if 블록 내의 모든 것이 실행되지 않기 때문에 조건부로 래핑을 해제하는 것이 옵션의 값에 액세스하는 가장 깨끗한 방법입니다.물론 다른 if 문과 마찬가지로 else 블록을 포함할 수 있습니다.
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
강제 개봉은, 「Force Unlaping(강제 개봉)」이라고 불리는 것을 채용하는 것에 의해서 행해집니다.!
('꽝') 꽝!이 방법은 안전성은 떨어지지만 코드를 컴파일할 수 있습니다.그러나 bang 연산자를 사용할 때마다 강제로 래핑을 해제하기 전에 변수가 실제로 솔리드 값을 포함하는지 1000% 확인해야 합니다.
var myString: String?
myString = "foobar"
print(myString!)
스위프트 값을 출력합니다.myString
foobar'로 되었습니다. the the the 、 the 、 시 、 the 、 the 、 。foobar
콘솔에 인쇄되어 있습니다.그런데이 이 정해져있지 .
var myString: String?
print(myString!)
이제 우리는 다른 상황을 떠안게 되었다.와는 달리할때 Optival-C는 Optival-C로 설정되어 있지 .nil
옵션의 래핑을 해제하려고 하면, 애플리케이션의 내용이 크래시 됩니다.
유형 주조로 포장을 해제합니다.아까도 말씀드렸지만unwrapping
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★비옵션 타입을 다른 타입으로 캐스팅 할 수도 있습니다.예를 들어 다음과 같습니다.
var something: Any?
에 변수가 .something
값이 설정됩니다.어쩌면 우리가 제네릭스를 사용하고 있거나, 아니면 이것을 변화시키는 다른 논리가 있을 수 있습니다. 코드 는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★something
다른 타입이라면 다른 방법으로 취급할 수 있습니다., 「」를 합니다.as
이치노
★★★★★★
as
는 Swiftoperator swift 입니다.
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
개의 해 주세요.as
키워드를 지정합니다.로 풀 때 하였습니다.!
BANG 퍼 bang bang bang bang bang bang bang bang bang bang bang bang 。을 할 , 을 하지 ''으로 예요.Int
그리고 그것은 반드시 다운될 수 있어야 한다.Int
이외의 경우에는 '방' 가 '방' 연산자일 때 '방' 연산자를 nil
애플리케이션이 크래쉬 합니다.
그리고 이 변수들을 어떤 종류의 연산이나 수학적 연산에 사용하기 위해서는 그 변수들을 풀어야 합니다.
예를 들어 Swift에서는 동일한 종류의 유효한 숫자 데이터 유형만 서로 작동할 수 있습니다.'타자'가 때as!
해당 유형의 변수임을 확신하는 것처럼 해당 변수를 강제로 다운캐스트하고 있으므로 응용 프로그램을 크래시하지 않고 작동해도 안전합니다.변수가 실제로 원하는 유형이면 문제가 없습니다. 그렇지 않으면 문제가 생깁니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★.as!
코드를 컴파일할 수 있습니다.as?
사실은요.as?
Int
완전히 다른 데이터 유형으로 변환됩니다.
은 금이다 now이다.Optional(0)
그리고 만약 당신이 숙제를 하려고 노력한다면, 다음과 같은 것을 쓰려고 한다면.
1 + Optional(1) = 2
당신의 수학 선생님은 당신에게 "F"를 줬을 것입니다.스위프트도 마찬가지야.스위프트가 점수를 주는 것보다 아예 컴파일하지 않는 게 낫다는 것만 빼면요.왜냐하면 결국 선택사항은 사실상 0이 될 수 있기 때문입니다.
Safety First Kids.
Swift에서 옵션 값을 언랩하는 방법은 7가지가 있습니다.
- 옵션 바인딩 - 안전
- 체인(옵션) - 안전
- 옵션 패턴 - 안전
- 통합 없음 - 안전
- 가드 스테이트먼트 - 안전
- 강제 개봉 - 안전하지 않음
- 암묵적 언랩 - 안전하지 않음
언급URL : https://stackoverflow.com/questions/24034483/what-is-an-unwrapped-value-in-swift
'programing' 카테고리의 다른 글
빠르고 슬림한 iPhone/iPad/iOS용 PDF 뷰어 - 힌트? (0) | 2023.04.14 |
---|---|
python에서 nice 열 출력을 만듭니다. (0) | 2023.04.09 |
Swift 5.1로 컴파일된 모듈은 Swift 5.1.2 컴파일러에서 가져올 수 없습니다. (0) | 2023.04.09 |
git에서 복제된 프로젝트에서 버전 추적을 제거하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
WPF에서 메인 창을 중앙에 배치하려면 어떻게 해야 합니까? (0) | 2023.04.09 |