2016-03-22 12 views
15

Problem:Rodzaj optionals nie można poprawnie wywnioskować w szybkim 2,2

Kiedy uruchomiony następujący kod pod Xcode 7.3 z szybkiej 2.2, kompilator nie jest w stanie prawidłowo wywnioskować typ opcjonalny:

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) 

na mojej stronie z Xcode 7.3 to będzie drukować I am an Int?

jednak, kiedy zainicjować zmienną pusty ciąg przed przekazaniem go do funkcji, przełącznik wnioskuje, że jest to Strunowy?.

To mogłoby wydrukować I am a String? w poprzedniej wersji Xcode.

Czy otrzymujesz podobne wyniki?

Uwagi:

To samo dzieje się w przypadku korzystania z tej opcji Podpis:

func whatAmI(property:AnyObject?) 

- Bug -

Ten problem jest regresja w szybkim 2,2: https://bugs.swift.org/browse/SR-1024

+1

To wydaje się dziwne zachowanie, może to być błąd. Widzę, że 'T' został wywnioskowany jako' String' i '(zero jako T?), Czy Int?' Przejdzie, ale '(zero jako String?) Będzie w stanie Int?'. – Sulthan

+0

Dziwne: działa to dla mnie na Swift 2.1.1, tzn. Program wyświetla komunikat "Jestem struną?" – tom

+1

Proponuję zgłoszenie zgłoszenia błędu. Naprawdę bardzo ładnie. – matt

Odpowiedz

3

To wydaje się być błędem. Minimalny przykład jest następujący:

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

Dodano przykład kodu do raportu o błędzie. – svrs

Powiązane problemy