2014-08-30 9 views
6

(NSObject, AnyObject) türünde bir nesneyi String türüne nasıl dönüştürebilirim? Aşağıdaki yöntemin ilk satırının sonunda '(NSObject, AnyObject)', 'String' dönüştürülemez

, as String derleyici hatası neden olur:

'(NSObject, AnyObject)' is not convertible to 'String' 

yerine String derlemesinin NSString için street Döküm, ama yapmak istiyorum çünkü String için street döküm ediyorumile karşılaştırın, String!, NSString değil.

Ben name ve street opsiyoneldir biliyorum ama olmayan nil adları ve sokaklar var gibi tüm yerler MKLocalSearch döndü çünkü onlar şimdilik nil değiliz farz ediyorum.

func formatPlacemark(placemark: CLPlacemark) -> (String, String) { 
    let street = placemark.addressDictionary["Street"] as String 
    if placemark.name == street { 
     // Do something 
    } 
} 

cevap

6

A String, bir nesne değil. Bunu yapmak ve aynı anda açmak için aşağıdaki sözdizimini öneriyorum. Uyumlu olduklarından, String! türünde bir değişkene kıyasla endişelenmeyin. Bu çalışacaktır:

func formatPlacemark(placemark: CLPlacemark) -> (String, String) { 
    if let street = placemark.addressDictionary["Street"] as? NSString { 
     if placemark.name == street { 
      // Do something 
     } 
    } 
} 

Bu "Sokak" nesne türü için sözlükte veya eğer geçerli bir anahtar değilse NSString dışındaki bir şey olduğunu ekledi faydaları vardır, bu kilitlenmez. Sadece bloğa girmeyecek.

Eğer gerçekten sokak bunu yapabileceği bir String olmak istiyorsanız:

if let street:String = placemark.addressDictionary["Street"] as? NSString 

ama size bu durumda bir şey satın almaz.

+0

Yerbilimini yapabileceğimi nereden biliyorsun?street.isEqualToString (placemark.name) 'yerine == street' yerine? Nesne kimliği ('==') değil, dize eşitliğini ('isEqualToString') kontrol ettiğimden emin olmak istiyorum. – ma11hew28

+0

Swift, iki tür arasında otomatik olarak köprü oluşturur ve '==' dize eşitliğinin test edilmesinin Swift yoludur. Bkz. Https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html – vacawama

+0

Bir Oyun Alanı'nda deneyin. İstediğiniz gibi çalıştığını göreceksiniz. – vacawama

1

Ben addressDictionary bir NSDictionary olmakla ne gerekebilir düşünüyorum.

Bir Swift sözlüğüne addressDictionary dönüştürürseniz, çalışmalıdır. hızlı bir sözlük için simge yoluyla yukarıya bakarak

let street = (placemark.addressDictionary as Dictionary<String, String>)["String"] 
+0

Ancak, bu [@ vacawama'nın çözümünden daha yavaş mıdır (http://stackoverflow.com/a/25582668/242933)? Çünkü 'Sözlük' 'NSDictionary''dan tamamen farklı değil mi? Yani, 'NSDictionary' sözcüğünü 'Dictionary''e çevirmek demek, bu program tamamen yeni bir '' '' '' '' '' '' '' 'object' nesnesini oluşturmak ve orijinal' NSDictionary'ın anahtarları ve değerleri ile doldurmak zorunda kalacak mı? Bu sadece basit bir oyuncudan daha çok iş gibi geliyor. – ma11hew28

+0

Bu güvenli değil. Sözlükte herhangi bir değer bir "NSString" dışında bir nesne ise, bu uygulama çökecektir. Bunu yalnızca, tüm nesnelerin 'NSString' olduğunu düşündüğünüzde% 100 olsaydınız yaparsınız, ve sonra veri ilk oluşturulduğunda bunu yalnızca bir kez yaparsınız. 'NSDictionary' öğesini almak için uygulamanıza harici bir API çağırıyorsanız, her bir nesneyi isteğe bağlı olarak cast operatörünün türünü (? ') Olarak kontrol etmek daha güvenli olacaktır. – vacawama

2

döndürme türü verilen anahtar için herhangi bir değer olabilir çünkü isteğe bağlı olmak zorundadır.

yapmanız gerekir Therefor: Bir NSString için döküm gerekiyor böylece

as String? 
+1

'String?' Olarak aynı derleyici hatası verir. – ma11hew28