2014-08-30 16 views
6

Làm cách nào để chuyển đổi một đối tượng thuộc loại (NSObject, AnyObject) thành loại String?'(NSObject, AnyObject)' không thể chuyển đổi thành 'Chuỗi'

Vào cuối dòng đầu tiên của phương pháp dưới đây, as String gây ra lỗi biên dịch:

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

Đúc street để NSString thay vì String biên dịch, nhưng tôi đúc street để String vì tôi muốn so sánh nó với placemark.name, có loại String!, không phải là NSString.

Tôi biết namestreet là optionals, nhưng tôi giả định họ không nil cho bây giờ bởi vì tất cả các nơi trở về từ MKLocalSearch dường như có những cái tên không bằng không và đường phố.

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

Trả lời

6

Một String không phải là một đối tượng, do đó bạn không cần phải cast nó vào một NSString. Tôi muốn giới thiệu cú pháp sau để bỏ nó và mở nó ra cùng một lúc. Đừng lo lắng về việc so sánh nó với một biến loại String! vì chúng tương thích. Điều này sẽ làm việc:

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

này có những lợi ích nói thêm rằng nếu "Street" không phải là một chìa khóa hợp lệ trong từ điển của bạn hoặc nếu các loại đối tượng là một cái gì đó khác hơn NSString, điều này sẽ không sụp đổ. Nó sẽ không đi vào khối.

Nếu bạn thực sự muốn đường phố trở thành một String bạn có thể làm điều này:

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

nhưng nó không mua cho bạn bất cứ điều gì trong trường hợp này.

+0

Làm cách nào để bạn biết tôi có thể thực hiện 'dấu vị trí.name == street' thay vì 'street.isEqualToString (placemark.name)'? Tôi muốn chắc chắn rằng tôi đang kiểm tra chuỗi bình đẳng ('isEqualToString'), không phải là đối tượng nhận dạng (' == '). – ma11hew28

+0

Swift tự động cầu nối giữa hai loại, và '==' là cách Swift kiểm tra sự bình đẳng chuỗi. Xem: https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html – vacawama

+0

Dùng thử trong Sân chơi. Bạn sẽ thấy nó hoạt động như bạn muốn. – vacawama

1

Tôi nghĩ rằng nó có thể phải làm với addressDictionaryNSDictionary.

Nếu bạn chuyển đổi addressDictionary thành từ điển Swift, nó sẽ hoạt động.

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

Nhưng, điều này có chậm hơn giải pháp [@ vacawama] (http://stackoverflow.com/a/25582668/242933) không? Bởi vì không phải là 'Dictionary' hoàn toàn khác với' NSDictionary'? Vì vậy, điều đó có nghĩa là bằng cách đưa 'NSDictionary' vào' Dictionary', chương trình sẽ phải tạo một đối tượng 'Dictionary' hoàn toàn mới và điền nó với các khóa & giá trị của' NSDictionary' ban đầu? Nghe có vẻ như nhiều việc hơn là một dàn diễn viên đơn giản. – ma11hew28

+0

Điều này không an toàn. Nếu bất kỳ giá trị nào trong từ điển là một đối tượng khác với 'NSString', điều này sẽ làm hỏng ứng dụng. Bạn sẽ chỉ làm điều này nếu bạn chắc chắn 100% tất cả các đối tượng là 'NSString's, và sau đó bạn chỉ thực hiện một lần, khi dữ liệu được tạo lần đầu tiên. Nếu bạn đang gọi một API bên ngoài ứng dụng của bạn để lấy 'NSDictionary', thì sẽ an toàn hơn khi kiểm tra từng đối tượng với dạng tùy chọn của toán tử cast type (' as? '). – vacawama

2

Loại trả về từ tra cứu qua chỉ số cho từ điển nhanh phải là tùy chọn vì không có giá trị cho khóa đã cho.

Therefor bạn phải làm:

as String? 
+1

'như String?' Cho cùng một lỗi trình biên dịch. – ma11hew28

Các vấn đề liên quan