2016-09-27 2 views
1

Скажем, у меня есть переменная с типомUnwrapping общий тип

let someVariable: SomeType<AnotherType?> 

, и я уверен, что этот конкретный экземпляр не содержит каких-либо nil из AnotherType?. Есть ли общий способ конвертировать его в SomeType<AnotherType>? Например, мне нужна эта конвертация для использования someVariable в некоторой функции.

+1

Возможный дубликат http://stackoverflow.com/questions/34563161/how-can-i-write-a-function-that-will-unwrap-a-generic-property-in-swift-assuming –

+0

@BenjaminLowry не согласны. Вопрос, который вы связываете, о 'SequenceType' и об удалении случаев« nil ». В моем вопросе нет случаев «nil» и общего типа. –

+2

'SomeType ' и 'SomeType ' - разные и несвязанные типы. Без конкретной информации (например, как создать экземпляр SomeType) это может быть сложно ответить. –

ответ

0

Это может идти вдоль этих линий:

protocol _Optional { 
    associatedtype _Wrapped 
    func unveil() -> _Wrapped? 
} 

extension Optional: _Optional { 
    typealias _Wrapped = Wrapped 
    func unveil() -> _Wrapped? { return self } 
} 

extension SomeType where T: _Optional { 
    func rewrap() -> SomeType<T._Wrapped>? { 
     guard let _value = value.unveil() else { return nil } 
     return SomeType<T._Wrapped>(value: _value) 
    } 
} 

struct SomeType<T> { 
    let value: T 
} 

let someValue = SomeType<Int?>(value: 42)  // SomeType<Int?> 
let rewrappedValue = someValue.rewrap()   // SomeType<Int>? 
let forceUnwrappedValue = someValue.rewrap()! // SomeType<Int> 

Особенности зависят от деталей конкретной реализации для SomeType (я использую простейшее предположение в моем примере).