2017-08-13 4 views
1

私はコンバータクラスを持っていますが、Tはオプションのタイプにすることができます。Swiftオプションのテンプレートタイプ予期しないパラメータの振る舞い

印刷です:

val: nil 
Optional<String> 
val is nil: false 

はなぜnilを印刷しているとの条件val == nilfalseですかnilの値を変換しようとi'amは

class Converter<T> 
{ 
    init(){} 

    func convertVal(_ val: T) -> T 
    { 
     print("val: \(val)") 
     print(type(of: val)) 
     print("val is nil: \(val == nil)") 
     return val 
    } 
} 

let firstStr: String? = nil 

let converter = Converter<String?>() 



var str = converter.convertVal(firstStr) 

+1

、ヴァル 'で' nil'は== nil'は 'オプション<オプション> .none'を意味するように推察されます。そして、valは 'Optional .some(Optional .none)'です。これは等しくありません。 – Alexander

+0

@Alexanderどのように安全にアンラップしてnilをテストするか、それを使用可能にすることができますか?私も入れようとしました! (unwrapper)は動作しても動作しません。オプション<任意の> – 4bottiglie

答えて

2

私の代わりに、通常のStringを入力しね何がやりたいことはconvertVal関数のパラメータと戻り値の型をオプションにいると思うとConverter

class Converter<T> { 
    init() {} 

    func convertVal(_ val: T?) -> T? { 
     print("val: \(val)") 
     print(type(of: val)) 
     print("val is nil: \(val == nil)") 
     return val 
    } 
} 

let firstStr: String? = nil 

let converter = Converter<String>() 
var str = converter.convertVal(firstStr) 

出力:あなたの例では

val: nil 
Optional<String> 
val is nil: true 
+0

オプションの値を持つことができます。あなたの例では、convertValは常にオプションの値を返します。何かはTタイプで制御したいものです。 – 4bottiglie

+0

@ 4bottiglieあなたはジェネリック型で選択性をコントロールしません、と私は信じています。このconvertValが非オプションのTのみを返すようにしたい場合は、func convertVal(_val:T?) - > Tを指定します。基本的に、ジェネリック型はオプション性をカプセル化しているとは思いません。 – Smartcat

+0

私は基本的に、パラメータと戻り値の型と同じ型を持つクラスが必要でした。 convertVal(_val:T?) - > T?またはconvertVal(_val:T) - > T.私が見ることができるように、予期せぬ動作を引き起こすため、swiftはテンプレートとしてオプションの型をサポートしていません。 – 4bottiglie

関連する問題