2014-06-03 10 views
7

Mam problemy z uzyskaniem dostępu do mojego szybkiego rozszerzenia z obiektu-c.Uzyskiwanie dostępu do rozszerzenia Swift z Objective-C

Mam następujący kod w pliku .swift:

extension NSDictionary { 
    func dictionaryAsJsonString() -> NSString { 
     var err: NSError? 
     var data = NSJSONSerialization.dataWithJSONObject(self, options: NSJSONWritingOptions.PrettyPrinted, error: &err) 
     var string = NSString(data: data, encoding: NSUTF8StringEncoding) 
     return string 
    } 
} 

Czekam, aby móc wykonać następujące czynności w moim pliku .m:

[dictionary dictionaryAsJsonString]; 

ale może” t znaleźć moją metodę i nie autouzupełniania.

Wiem, że mój przywóz działa prawidłowo, ponieważ jestem w stanie uzyskać dostęp do innych moich obiektów.

+0

Czy dowiedzieć się, jak zadzwonić rozszerzeń z Objective-C – user2924482

Odpowiedz

0

Łatwo jest po prostu za pomocą słownika

20> extension Dictionary { 
21.  func toJSONString() -> String { return "my dictionary" } 
22. } 
23> ["a": 1, "b": 2].toJSONString() 
$R10: String = "my dictionary" 

Dokumentacja Apple nie wspominając przy użyciu rozszerzeń o zajęciach Objective-C.

+3

W dokumentacji, wspominają, jak rozszerzenia są analogiczne do kategorie (co możesz zrobić w ten sposób). Chociaż jeszcze tego nie próbowałem, zakładam, że jeśli mam kategorię w istniejącej klasie obj-c, będę mógł uzyskać dostęp do tych metod za pomocą szybkiego. Ale zgodnie z tym, co powiedziałeś, to nie działa w drugą stronę? – Olshansk

1

To był prawdopodobnie błąd lub niepełna implementacja we wczesnej wersji, którą wypróbowałeś w czerwcu. Działa dobrze, aby rozszerzyć NSDictionary w najnowszej wersji beta. Na przykład, ten bardzo skomplikowanych rozszerzeń i użytkowania działa zgodnie z oczekiwaniami, a jej zakończenie kodu:

extension NSDictionary { 
    func myFooBar() { 
     println("gaaah") 
    } 
} 

// elsewhere... 

var d = NSDictionary(object: "bar", forKey: "foo") 
d.myFooBar() 
+0

od wersji XCode 7.1.1 (7B1005) Robienie gdzie indziej części w punkcie c nie działa. – Intentss