2015-06-07 10 views
6

Występuje dziwny problem z funkcją Array.sort(). Nie akceptuje skróconego zamknięcia. Xcode narzeka z następującym komunikatem, gdy używa skróconego zamknięcia: Cannot invoke 'sort' with an argument list of type '((_, _) -> _)' Ale działa z dłuższą formą tego samego zamknięcia.Swift Array.sort() nie zaakceptuje zamknięcia w skróconym formacie

var names = ["Al", "Mike", "Clint", "Bob"] 

// This `sort()` function call fails: 
names.sort { 
    $0.localizedCaseInsensitiveCompare($1) == .OrderedAscending 
} 

// This `sort()` function call works: 
names.sort { (first: String, second: String) in 
    return first.localizedCaseInsensitiveCompare(second) == .OrderedAscending 
} 

Żeby dodatkowo dziwne, gdybym najpierw użyć długiej formy zamknięcia, a następnie rodzaj ponownie za pomocą formularza skrótowej, to działa dobrze!

var names = ["Al", "Mike", "Clint", "Bob"] 

// Works fine, orders the array alphabetically 
names.sort { (first: String, second: String) in 
    return first.localizedCaseInsensitiveCompare(second) == .OrderedAscending 
} 

// This shorthand version now works as well, reversing the order of the array 
names.sort { 
    $0.localizedCaseInsensitiveCompare($1) == .OrderedDescending 
} 

W najlepszym razie, robię coś nie tak i uczę się czegoś. Najgorszy przypadek, to tylko głupi błąd z Xcode lub Swift.

Wszelkie pomysły?

+0

OK, który jest bardzo dziwne i zdecydowanie to błąd kompilatora. Powinieneś go [złożyć] (http://bugreport.apple.com/). –

+0

Spodziewałem się, że to będzie zabawa na placu zabaw, ale ta sama zmiana kolejności i kompilacji ma miejsce również w przypadku 'swiftc'. –

+1

Interesujące. Jeśli po prostu wstawisz jakiekolwiek odniesienie do 'NSComparisonResult' (" Niech x: NSComparisonResult "to zrobi) na górze pliku, to również rozwiązuje problem z pierwszym przykładem. To tak, jakby [wyrażenie niejawnego członka] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID394) funkcja wymaga "zalewkowania" z bardziej wyraźnym odniesieniem do typu wyliczeniowego, zanim będzie działać. W związku z tym zmiana kolejności wyrażeń naprawia to. –

Odpowiedz

-1

jak @Martin R wskazał, źródłem problemu jest to, że wywołujesz metodę z NSString na typie Swift String.

to działa prawidłowo

names.sort { 
    $0 <= $1 
} 
+0

Dwie rzeczy: Po pierwsze, Swift String i NSString powinny być wolne od opłat, więc zadzwonienie do NSString na Swift String będzie działało. A przynajmniej tak powinno. Po drugie, metoda porównania, której używasz, używająca '<=' do porównywania dwóch łańcuchów, nie jest taka sama jak porównywanie bez rozróżniania wielkości liter. –

Powiązane problemy