Kann nicht Zugriff auf das Eigentum auf Swift Typ von Objective-C
Ich versuche, Zugriff auf einen Swift-Klasse Double?
Eigenschaft von Objective-C.
class BusinessDetailViewController: UIViewController {
var lat : Double?
var lon : Double?
//Other elements...
}
In einem anderen view-controller, ich bin versucht, Zugriff lat
wie folgt:
#import "i5km-Swift.h"
@interface ViewController ()
@property (strong, nonatomic) BusinessDetailViewController *businessDetailViewController;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.businessDetailViewController = [[BusinessDetailViewController alloc] initWithNibName:@"BusinessDetailViewController" bundle:nil];
self.businessDetailViewController.lat = businessArray[1]; /* THIS GIVES ME AN ERROR */
}
und ich bin immer
Eigenschaft 'lat' nicht gefunden " auf Objekt des Typs 'BusinessDetailViewController *'
Warum kann ich nicht auf diese Eigenschaft zugreifen? Was bin ich?
Ich weiß nicht, denn in businessDetailViewController, ich habe auch eine Steckdose
Ich denke, optional Strukturen nicht sichtbar sind, in Objective-C. überprüfen.
@IBOutlet var mapView: MKMapView?
und ich kann es von außen aber es hat nicht public
Ich denke, optional Strukturen nicht sichtbar sind, in Objective-C. überprüfen.
InformationsquelleAutor tranvutuan | 2014-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Optionale Werte der nicht-Objective-C-Typen sind nicht gebrückt in Objective-C. die ersten drei Eigenschaften
TestClass
unten würde werden in Objective-C, aber der vierte würde nicht:In Ihre Objective-C-code, würden Sie Zugriff auf die ersten drei Eigenschaften wie dieses:
In Ihrem Fall, können Sie entweder konvertieren
lat
undlong
werden, die nicht Optional sind, oder wechseln Sie zu Instanzen vonNSNumber
.Beachten Sie, dass Sie müssen vorsichtig sein, über Ihre Objective-C-code, wenn Sie die zweite Vorgehensweise (switching
lat
undlon
zu nicht-optionalen Eigenschaften TypNSNumber
) -- während der Swift-compiler verhindert, dass Sie bei der Zuweisungnil
zu nicht-optionalen Eigenschaften, die Objective-C-compiler hat keine Bedenken, so dass es, lassennil
Werte schleichen sich in Ihren Swift-code mit keine chance der Fang von Sie zur Laufzeit. Betrachten Sie diese Methode aufTestClass
:Dies funktioniert gut, wenn aufgerufen mit den Werten in den beiden Eigenschaften, aber wenn
nsNumberVar
eingestellt istnil
von der Objective-C-code, dieser wird Abstürzen zur Laufzeit. Beachten Sie, dass es keine Möglichkeit zu überprüfen,, ob oder nichtnsNumberVar
istnil
bevor Sie es verwenden!@objc protocol FooProtocol { var lat:Double? {get} }
Die Dokumentation dieser ist lückenhaft - zum Beispiel, dieser Seite sagt, dass Enumerationen und Strukturen definiert, die in den Swift nicht erhältlich in Obj-C, wird aber nicht erwähnt, dass die Optionen (die umgesetzt werden, als
enum
) und die meisten integriertenstruct
Arten Brücke ordentlich, bis Sie die Seite auf Kakao-Datentypen.Ich kann es beweisen, aber ich denke, eine optionale
NSNumber
überbrückt wird und eine optionaleInt
oderFloat
ist nicht möglich, weilNSNumber
ist ein Referenz-Typ, und.None
zugeordnet istnil
, in der Erwägung, dass ein Werttyp nichtnil
Gegenstück in objc. Ich bin nicht der Korrektur von Ihnen, nur gefragt, wenn Sie einverstanden sindDas ist richtig - in Objective-C jede Referenz geben kann
nil
, so sind Sie automatisch überbrückt, Swift-Optionen. In der Tat, man könnte argumentieren, dass bei einer Bridge-Projekt, keine Referenztypen sollte immer sein, die nicht Optional sind, da Sie zuordnen könnennil
zu auch eine nicht-Optionale Eigenschaft von Objective-C, was zu potenziellen Kollisionen mit keine Handhabe. Siehe mein Zusatz...Gut zu wissen - verwenden Sie nicht die überbrückung bei objc Seite, aber es ist etwas im Auge zu behalten, wenn ich (es ist nur eine Frage der Zeit, bis das passiert :))
InformationsquelleAutor Nate Cook
Wenn Sie Ihre Immobilie ist eine schnelle Protokoll-Typ, fügen Sie einfach
@objc
vor.Beispiel:
InformationsquelleAutor dmzza
Optionen ist eine schnelle, spezifische Funktion, die nicht verfügbar in obj-c ein. Optional Klassen-Instanzen arbeiten, weil ein null-optional zugeordnet werden kann, die zu einem null-Wert, aber Wert-Typen (int, Schwimmern, etc.) sind nicht Referenz-Typen, also Variablen dieser Typen speichern keine Referenz, sondern der Wert selbst.
Ich weiß nicht, ob es eine Lösung - ein möglicher workaround ist das erstellen von nicht optionalen Eigenschaften-Zuordnung der
nil
Wert auf eine ungenutzte Daten Typ Wert (z.B. -1 bei der Vertretung eines index, oder 999999 für eine Koordinate):Dass aussetzen sollte der
_lat
und_lon
Eigenschaften zu obj-c.Beachten Sie, dass ich noch nie versucht haben, so lassen Sie es uns bitte wissen, wenn es funktioniert.
Cool - vielen Dank für das teilen.
InformationsquelleAutor Antonio
Ist es jedoch möglich zu "Verpacken" Sie in ein NSNumber etwa so :
InformationsquelleAutor Axel Guilmin