Swift에서 옵션의 기본값을 제공하시겠습니까?
Swift에서 옵션을 다루는 관용구는 지나치게 장황해 보입니다. 만약 당신이 원하는 것이 기본값이 0인 경우에 기본값을 제공하는 것이라면:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
불필요하게 코드를 복제하는 것, 또는
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
필요한 것은unwrappedValue
상수가 아닙니다.
스칼라의 옵션 모나드(기본적으로 스위프트의 옵션과 동일한 아이디어)에는 다음과 같은 방법이 있습니다.getOrElse
이를 위해:
val myValue = optionalValue.getOrElse(defaultValue)
내가 뭘 빼놓았나요?스위프트는 이미 그것을 할 수 있는 간단한 방법을 가지고 있습니까?그렇지 않으면, 그것을 정의하는 것이 가능합니까?getOrElse
옵션의 확장으로?
갱신하다
Apple이 이제 병합 연산자를 추가했습니다.
var unwrappedValue = optionalValue ?? defaultValue
이 경우 3개의 연산자는 당신의 친구입니다.
var unwrappedValue = optionalValue ? optionalValue! : defaultValue
옵션 열거형에 대해 자체 확장자를 제공할 수도 있습니다.
extension Optional {
func or(defaultValue: T) -> T {
switch(self) {
case .None:
return defaultValue
case .Some(let value):
return value
}
}
}
그러면 다음을 수행할 수 있습니다.
optionalValue.or(defaultValue)
하지만, 다른 개발자들이 그것을 더 빨리 이해할 것이기 때문에, 나는 3개의 연산자를 고수하는 것을 추천합니다.or
방법
참고: 이와 같은 일반적인 도우미를 추가하기 위해 모듈을 시작했습니다.or
에Optional
신속하게
2014년 8월 현재 Swift에는 이를 허용하는 통합 운영자(??)가 있습니다.예를 들어 String myOption 옵션의 경우 다음과 같이 쓸 수 있습니다.
result = myOptional ?? "n/a"
다음을 작성한 경우:
let result = optionalValue ?? 50
그리고.optionalValue != nil
그리고나서result
될 것이다optional
또한, 당신은 미래에 그것을 포장을 벗길 필요할 것입니다.
하지만 당신은 연산자를 쓸 수 있습니다.
infix operator ??? { associativity left precedence 140 }
func ???<T>(optLeft:T?, right:T!) -> T!
{
if let left = optLeft
{
return left
}
else { return right}
}
이제 다음을 수행할 수 있습니다.
let result = optionalValue ??? 50
그리고 언제optionalValue != nil
그리고나서result
될 것이다unwraped
다음은 효과가 있는 것 같습니다.
extension Optional {
func getOrElse<T>(defaultValue: T) -> T {
if let value = self? {
return value as T
} else {
return defaultValue
}
}
}
그러나 캐스팅의 필요성은.value as T
추악한 해킹입니다.이상적으로, 다음과 같이 주장할 수 있는 방법이 있어야 합니다.T
옵션에 포함된 유형과 동일합니다.현재 상태로는 추론 세트를 입력합니다.T
getOrElse에 지정된 매개 변수를 기반으로 합니다. 이 매개 변수가 옵션과 일치하지 않고 옵션이 non-nil인 경우 런타임에 실패합니다.
let x: Int?
let y = x.getOrElse(1.414) // y inferred as Double, assigned 1.414
let a: Int? = 5
let b: Double = a.getOrElse(3.14) // Runtime failure casting 5 to Double
문자열을 사용하여 이 작업을 수행하려는 경우 이 작업을 수행할 수 있습니다.
string1 = string2.isEmpty ? "Default Value":string2
언급URL : https://stackoverflow.com/questions/24099985/providing-a-default-value-for-an-optional-in-swift
'programing' 카테고리의 다른 글
깃 - 원격:리포지토리를 찾을 수 없음 (0) | 2023.06.04 |
---|---|
ConverterParameter에서 열거형 사용 (0) | 2023.05.25 |
Eclipse, 정규식 검색 및 바꾸기 (0) | 2023.05.25 |
GitHub의 명령줄에서 pull 요청을 발행할 수 있습니까? (0) | 2023.05.25 |
WPF 목록 상자 빈 데이터 템플릿 (0) | 2023.05.25 |