2016-08-19 14 views
28

bir"tip türü 'dize' değerini atayamıyorum 'AnyObject?'", Swift 3 Xcode 8 beta 6

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

hatayı

aşağıdaki derleme zamanlı oluşturur kod oldukça basit bir parçası
Cannot assign value of type 'String' to type 'AnyObject?' 

Basit tip kontroller StringAnyObject

"value" is AnyObject // returns true 

bendeğişebilir olduğunu söyle Any ve her şeyiçalışacak

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

ama hata alıyorum neden anlamak istiyorum? String artık AnyObject mü? Yoksa bu bir böcek mi?

cevap

32

B6'da, String artık NSString'e sihirli köprüler değil. String bir sınıf değildir; bu bir yapı. Sen elle köprüleme yapmak gerekir:

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

is hala köprü gibi görünüyor gerçeği olasılıkla bir hata olduğunu ve rapor edilmelidir.

[String: AnyObject] ve [String: Any] kodunuzda mümkün olduğunca az kullanılmalıdır.

(aşağıdaki yorum Hamish sağlar bağlantısını takip emin olun.)

+0

sayesinde her şey sadece oldu. Bu yanlış-pozitif tip kontrolü, bu soruyu sormamın tek sebebi. – xinatanil

+2

[Joe Groff'e göre] (https://bugs.swift.org/browse/SR-2420?focusedCommentId=17394&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17394), ' AnyObject'in her zaman/her zaman başarılı olması gerektiği gibi, her şey artık "AnyObject" ile köprüler. Bunun bunun nedeni olduğuna inanıyorum çünkü 'id' artık Swift'e 'Any' (Köprü) olarak köprülüyor, artık AnyObject (kötülük, biliyorum) ile köprülenebilir. – Hamish

+1

Ve evet, hızlı bir şekilde AnyObject türü çek sorunlarıyla karşılaşıyor gibi görünüyor http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6 – xinatanil

4

Ben bazı resmi kaynaklarla @RobNapier's answer için tamamlayıcı olacak.


örtülü köprü mekanizmaları çıkarılması, aşağıdaki Swift evrim teklifi kabul edildi

önce

Swift 3 uygulanacak, örtülü dönüşüm olarak mevcut idi bazı Swift yerel türleri - ilişkili Objective-C türleri (özel koşullara uygun Swift türleri otocol _ObjectiveCBridgeable, ör. doğal Int, String,) Bu nedenle

, biz bir uzlaşma yapmaya karar verdi. , ancak diğer şekilde etrafında - Biz ilişkili Swift değer türü (> Dize Ör NSString) için köprülü bir Objective-C tip den dönüştürürken açık köprü atmalarını gerektirecektir.

... Swift 3 ile

[SE-0072 kaynaktan], örneğin örtülü dönüşüm mekanizması artık mevcut olacaktır. Swift 3 oluyor ithal API müthiş gelişmeler hepsi ile birlikte Objective-C jenerik tanıtımıyla geçen yıl ile

, Sanırım şu çalışmanın tamamlanması başka bir göz atın zamanı geldi.

...

Biz tamamen Swift 3 yılında örtülü köprü dönüşümleri ortadan öneriyorum. Bu, bazı kullanıcıların kodlarında daha açık yayınları tanıtmak zorunda kalabileceği anlamına gelir, ancak Swift'in tip sisteminden başka bir özel kılıfı çıkarır ve derleyicisini daha da basitleştirebiliriz.

... Daha önce Swift arasında örtük dönüşümler üzerindeki değeri türlerini ve bunların ilişkili köprülü Objective-C tipi dayanıyordu

Kod şimdi bir as aracılığıyla manuel zorlama döküm gerektirecektir.

Son olarak, the release notes for Xcode 8 beta 6 (giriş gereklidir) bu öneriyi şimdi beta 6 için uygulamaya konmuştur belirtiyor:

Yeni Xcode 8 beta 6 - Swift Derleyici: Swift Dil

...

  • örtük. Swift değer türünden karşılık gelen nesneye dönüşüm, as ile zorlanabilir. Örneğin: string as NSString. Herhangi bir Swift değeri de as AnyObject ile kutulu kimlik gösterimlerine dönüştürülmüş olabilir. (SE-0072)

W.r.t. Yeni "kutulu no", herhangi bir Swift değeri için AnyObject arasındaki açık dönüşüme izin verme, bkz. Aşağıdaki iplik: şüphelendiğim gibi cevap

İlgili konular