2016-03-22 2 views
15

Проблемы:Тип опций не может быть корректно выведен в быстрой 2,2

При выполнении следующего кода под Xcode 7.3 с быстрым 2.2, компилятор не может правильно определить тип опциональные:

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) 

на моей стороне с Xcode 7.3 отпечатывается I am an Int?

Однако, когда я инициализировать переменную с пустой строкой перед передачей его функции, переключатель делает вывод, что это Строка ?.

Это будет печатать I am a String? в предыдущей версии Xcode.

Вы получаете похожие результаты?

Наблюдения:

То же самое происходит при использовании этой функции подписи:

func whatAmI(property:AnyObject?) 

- Bug -

Этот вопрос является регресс в быстром 2.2: https://bugs.swift.org/browse/SR-1024

+1

Это похоже на очень странное поведение, на самом деле это может быть ошибка. Я вижу, что 'T' было выведено как' String' и '(nil as T?) Является Int?' Будет проходить, но '(nil as String?) Является Int?' Будет терпеть неудачу. – Sulthan

+0

Странно: это работает для меня на Swift 2.1.1, то есть программные выходы 'I are String?' – tom

+1

Я бы предложил подать отчет об ошибке. Очень хорошо. – matt

ответ

3

Этот кажется, ошибка. Минимальный пример:

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

Добавил ваш образец кода в отчет об ошибке. – svrs

Смежные вопросы