2016-08-19 25 views
28

dość prosty kawałek kodu"Nie można przypisać wartości typu 'string' wpisać 'AnyObject?'", Swift 3, Xcode 8 beta 6

var dict: [String: AnyObject] = [:] 
dict["key"] = "value" 

generuje następujący kompilacji Błąd

Cannot assign value of type 'String' to type 'AnyObject?' 

Proste kontrole typu powiedzieć, że String jest AnyObject

"value" is AnyObject // returns true 

mogę zmienić AnyObject do Any i wszystko będzie działać

var dict: [String: Any] = [:] 
dict["key"] = "value" 

ale chcę zrozumieć, dlaczego pojawia się błąd? Czy String nie jest już AnyObject? Czy to błąd?

Odpowiedz

32

W b6 ciąg nie magicznie łączy się z NSString. String nie jest klasą; to jest struktura. Trzeba zrobić mostków ręcznie:

dict["key"] = "value" as AnyObject 

Fakt is wciąż wydaje się być pomostowych jest prawdopodobnie błąd i powinny być zgłaszane.

Jest rzeczą oczywistą, że [String: AnyObject] i [String: Any] powinny być używane tak mało jak to możliwe w kodzie.

(Upewnij się, aby skorzystać z linku Hamish zapewnia w komentarzach poniżej.)

+0

Dzięki za odpowiedź, wszystko było tak jak podejrzewałem. Ta fałszywa pozytywna kontrola jest jedynym powodem, dla którego zadałem to pytanie. – xinatanil

+2

[Według Joe Groff] (https://bugs.swift.org/browse/SR-2420?focusedCommentId=17394&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17394), is/as AnyObject' powinien zawsze odnieść sukces, ponieważ wszystko jest teraz mostkowane do 'AnyObject'. Wierzę, że dzieje się tak dlatego, że 'id' jest teraz połączony z Swift jako' Any', 'Any' może teraz zostać zmostkowany do' AnyObject' (dziwne, wiem). – Hamish

+1

A tak, wygląda na to, że Swift ma problemy z typem AnyObject http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6 – xinatanil

4

będę uzupełnienie @RobNapier's answer z niektórych oficjalnych źródeł.


Usunięcie ukrytych mechanizmów pomostowych została przyjęta w poniższej Swift wniosku ewolucji, które mają być realizowane przez Swift 3

Wcześniej, konwersje niejawne były dostępne od Niektóre typy natywne Swift: na powiązane obiekty typu Objective-C (Typy Swift zgodne z prywatnym pr otok _ObjectiveCBridgeable, np. natywnie Int, String,)

Z tego powodu zdecydowaliśmy się na kompromis. Chcielibyśmy wymagają wyraźny pomostowego rzuca podczas konwersji od zmostkowany Objective-C typu do z towarzyszącym mu Swift typu wartości (np NSString -> String), ale nie na odwrót.

... [Z SE-0072]

Z Swift 3, takie ukryte mechanizmy konwersji nie będzie już dostępny.

Wraz z wprowadzeniem leków generycznych Objective-C w ubiegłym roku, wraz z wszystkim z awesome ulepszeń API importujących dzieje na Swift 3, myślę, że nadszedł czas, że możemy przyjrzeć się wykonanie tej pracy.

...

Proponuję całkowicie wyeliminować niejawne konwersje pomostowych w Swift 3. Oznaczałoby to, że niektórzy użytkownicy musieliby wprowadzić bardziej wyraźnych rzutów w swoim kodzie, ale musielibyśmy usunąć kolejną specjalną obudowę z systemu Swift i móc jeszcze bardziej uprościć kompilator .

...

Kod, który uprzednio powołanych niejawne konwersje pomiędzy Swift typy wartości i związane z nimi zmostkowany typ Objective-C będzie teraz wymagają ręcznego przymus poprzez as cast.

Wreszcie the release notes for Xcode 8 beta 6 (wymagane logowanie) stwierdza, że ​​wniosek ten został wdrożony do beta 6:

nowego w Xcode 8 beta 6 - Swift Compiler: Swift Język

...

  • Pomosty przejściowe nie są długotrwałe r implicit. Konwersję z typu wartości Swift do odpowiedniego obiektu można wymusić za pomocą as. Na przykład: string as NSString. Dowolna wartość Swift może być również przekonwertowana na jego reprezentację reprezentacji pudełkowej z as AnyObject. (SE-0072)

W.r.t. nowy "identyfikator pola" umożliwiający jawną konwersję dowolnej wartości Swift na AnyObject, patrz np. wątku:

Powiązane problemy