2017-12-24 173 views
5

Wcześniej przeszedł interesujący błąd, pracując z lekami generycznymi w Swift. Znalazłem rozwiązanie, ale zastanawiam się, czy ktoś może odpowiedzieć, dlaczego kompilator nie łapie czegoś takiego. Zacznę od bloku kodu.Co jest z pustymi tablicami i rodzajami w Swift?

func doSomething<T>(with array: [T]) { 
    type(of: array)  // Optional<Array<Int>> 
    array is [Int]  // true 
    array is [String] // true 
} 

var arrayOfInts: [Int] = [] 
doSomething(with: arrayOfInts) 

patrz linia 4. Dlaczego do cholery jest true? Czy czegoś brakuje? Czy kompilator nie powinien być wystarczająco inteligentny, aby stwierdzić, że nie jest to tablica z String s? To ostatecznie doprowadziło do błędu, w którym wartość została ustawiona niepoprawnie z powodu pustej tablicy uznanej za niewłaściwą.

miarę rozwiązanie, poszedłem coś wzdłuż linii:

if type(of: array).Element.self == Model.self 
+0

Jesteś _nie__ typem elementów tablicy; to T. Simpler: 'if T.self == Int .self' – matt

+1

Również nie otrzymuję' Opcjonalnie > 'dla pierwszej linii. – matt

+1

Generic to czerwony śledzia! '[Int]() to [String]' to 'true'. – matt

Odpowiedz

6

Właściwie to nie ma nic wspólnego z nazwą rodzajową. Wszelkie pusta tablica odpowiada na pytanie is z true jeśli typ jest tablicą:

[Int]() is [String] // true 
[1] is [String] // false 

Wydaje się dziwne; file a bug.