iOS 스터디 Part3 Force-Unwrap
강제로 unwrapping을 하는 Force-Unwrap에 대해 알아보고자 한다.
Last updated
강제로 unwrapping을 하는 Force-Unwrap에 대해 알아보고자 한다.
Last updated
extension Sequence {
func compactMap<B>(_ transform: (Element) -> B?) -> [B] {
return lazy.map(transform).!lter { $0 != nil }.map { $0! }
}
}let ages = [
"Tim": 53,"Angela":54,"Craig":44, "Jony": 47, "Chris": 37, "Michael": 34,
]
// Force-unwrap
ages.keys
.!lter { name in ages[name]! < 50 }
.sorted()
// not force-unwrap(권장)
ages
.!lter { (_, age) in age < 50 }
.map { (name, _) in name }
.sorted()infix operator !!
func !! <T>(wrapped: T?, failureText: @autoclosure () -> String) -> T { ifletx=wrapped{returnx}
fatalError(failureText())
}
let s = "foo"
let i = Int(s) !! "Expecting integer, got \\"\\(s)\\""infix operator !?
func !?<T: ExpressibleByIntegerLiteral>
(wrapped: T?, failureText: @autoclosure () -> String) -> T
{
assert(wrapped != nil, failureText())
return wrapped ?? 0
}
lets="20"
let i = Int(s) !? "Expecting integer, got \\"\\(s)\\""// 리스트
func !?<T: ExpressibleByArrayLiteral>
(wrapped: T?, failureText: @autoclosure () -> String) -> T
{
assert(wrapped != nil, failureText())
return wrapped ?? []
}
// 문자열
func !?<T: ExpressibleByStringLiteral>
(wrapped: T?, failureText: @autoclosure () -> String) -> T
{
assert(wrapped != nil, failureText())
return wrapped ?? ""
}
// 기본값과 오류 텍스트를 같이 사용하고 싶은 경우
func !?<T>(wrapped: T?,
nilDefault: @autoclosure () -> (value: T, text: String)) -> T
{
assert(wrapped != nil, nilDefault().text)
return wrapped ?? nilDefault().value
}
Int(s) !? (5, "Expected integer")
// void를 반환하는 메서드의 경우
func !?(wrapped: ()?, failureText: @autoclosure () -> String)
{
assert(wrapped != nil, failureText())
}
var output: String? = nil
output?.write("something") !? "Wasn't expecting chained nil here"