Тип опций не может быть правильно определен в Swift 2.2

Проблема:

При запуске следующего кода в Xcode 7.3 с swift 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?

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

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

Вы получаете аналогичные результаты?

Наблюдения:

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

func whatAmI(property:AnyObject?)

-- Ошибка --

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


person schmittsfn    schedule 22.03.2016    source источник
comment
Это кажется очень странным поведением, на самом деле это может быть ошибка. Я вижу, что T был выведен как String, и (nil as T?) is Int? пройдет, но (nil as String?) is Int? не пройдет.   -  person Sulthan    schedule 22.03.2016
comment
Странно: у меня это работает на Swift 2.1.1, т.е. программа выводит I am a String?   -  person tom    schedule 22.03.2016
comment
Я бы предложил подать отчет об ошибке. Действительно очень приятно.   -  person matt    schedule 22.03.2016
comment
Вау. Если вы измените порядок операторов case, получится I am a String?. Так что это просто идет для первого, что бы это ни было.   -  person matt    schedule 22.03.2016
comment
Отправлен отчет об ошибке: bugs.swift.org/browse/SR-1024   -  person schmittsfn    schedule 22.03.2016
comment
@Braiam, почему вы удалили теги swift2.2 и Xcode7.3?   -  person schmittsfn    schedule 23.03.2016


Ответы (1)


Кажется, это ошибка. Минимальный пример следующий:

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("")
person Sulthan    schedule 23.03.2016