2016-03-22 10 views
15

Problema:Tipo di optional non si può dedurre correttamente in rapida 2.2

Quando si esegue il seguente codice sotto Xcode 7.3 con rapido 2.2, il compilatore non è in grado di dedurre correttamente il tipo di optional:

import Foundation 

func whatAmI<T>(inout property:T?) 
{ 
    switch property { 
    case is Int?: 
     print("I am an Int?") 
    case is String?: 
     print("I am a String?") 
    default: 
     print("I don't know what I am") 
    } 
} 

var string : String? 
whatAmI(&string) 

al mio fianco con Xcode 7.3 questo stampa I am an Int?

Tuttavia, quando ho inizializzare la variabile con una stringa vuota prima di passarlo alla funzione, l'interruttore deduce che sia un Stringa?.

Questo dovrebbe stampare I am a String? nella versione Xcode precedente.

Stai ottenendo risultati simili?

Osservazioni:

Lo stesso accade quando si utilizza questa funzione di firma:

func whatAmI(property:AnyObject?) 

- Bug -

Questo problema è una regressione a Swift 2.2: https://bugs.swift.org/browse/SR-1024

+1

Questo sembra un comportamento molto strano, potrebbe effettivamente essere un bug. Vedo che 'T' è stato inferito come' String' e '(nil as T?) È Int?' Passerà ma '(nil as String?) È Int?' Fallirà. – Sulthan

+0

Strano: questo funziona per me su Swift 2.1.1 cioè il programma emette "I am a String?" – tom

+1

Suggerirei di presentare una segnalazione di errore. Davvero molto bello. – matt

risposta

3

Questo sembra essere un bug L'esempio minimo è il seguente:

func genericMethod<T>(property: T?) { 
    print(T) // String 

    let stringNil = Optional<String>.None 

    print(stringNil is String?) // true (warning - always true)  
    print(stringNil is T?) // true 

    let intNil = Optional<Int>.None 

    print(intNil is String?) // false (warning - always fails) 
    print(intNil is T?) // true - BUG 
} 

genericMethod("") 
+0

Aggiunto il tuo esempio di codice alla segnalazione di bug. – svrs

Problemi correlati