前提:Optional是一個(gè)具體類型飘言,無法用作范型類型的約束。
問題一:使用了范型的方法里翎苫,如何知道是否是一個(gè)可選型呢?
func handle<T>(type:T.type) throws -> T {
}
obj.handle(type:String)// T為String
obj. handle(type:String?)// T為Optional<String>
需求:
當(dāng)obj為null時(shí)榨了,obj.handle(type:String)拋出異常煎谍,obj. handle(type:String?)返回nil
要做的是在方法里判斷type是否為可選型:
func handle<T>(type:T.type) throws -> T {
if type is Optional {
return nil
}else{
throw Error
}
}
但是Optional是一個(gè)確切的類型,是一個(gè)包含some和none的一個(gè)結(jié)構(gòu)體龙屉。你沒法辦知道范型T是否為Optional呐粘。
換個(gè)思路满俗,如果nil可以轉(zhuǎn)為T,則表明T是個(gè)可選型作岖。
if let nilT = Optional<Any>.none as? T {
return nilT
}else{
throw Error
}
...
問題二:給數(shù)組添加一個(gè)移除nil元素的方法唆垃,使用范型T,如何知道該類型T是可選型且值是nil痘儡?
如何使用一個(gè)夠約束范型為Optional的協(xié)議呢辕万?
新建一個(gè)協(xié)議,然后讓Optional遵守這個(gè)協(xié)議沉删。
public protocol OptionalType: ExpressibleByNilLiteral {
associatedtype WrappedType
var asOptional: WrappedType? { get }
}
extension Optional: OptionalType {
public var asOptional: Wrapped? {
return self
}
}
在Optional擴(kuò)展里渐尿,利用類型推斷確定了OptionalType里范型的類型。
如此即可以通過ele.asOptional得到一個(gè)值或者nil丑念。
public extension Sequence where Self.Iterator.Element: OptionalType {
public func removingNils() -> [Self.Iterator.Element.WrappedType] {
return flatMap { $0.asOptional }
}
}