2015-02-17 9 views
10

Nehme ich verrückte Pillen? Direkt aus der Dokumentation:Wie Swift String zu Objective C NSString zu überbrücken?

"Swift verbindet automatisch zwischen dem String-Typ und der NSString-Klasse. Dies bedeutet, dass Sie überall, wo Sie ein NSString-Objekt verwenden, stattdessen einen Swift-String-Typ verwenden und die Vorteile beider Typen nutzen können - die Interpolation des Typs "String" und die Swift-designten APIs sowie die breite Funktionalität der NSString-Klasse. Aus diesem Grund sollten Sie die NSString-Klasse fast nie direkt in Ihrem eigenen Code verwenden müssen. Wenn Swift Objective-C-APIs importiert, werden alle NSString-Typen durch String-Typen ersetzt. Wenn Ihr Objective-C-Code eine Swift-Klasse verwendet, ersetzt das Importer alle String-Typen durch NSString in der importierten API.

String Überbrückung zu aktivieren, importieren Foundation nur „

Ich habe dies getan ... betrachten.

import Foundation 

var str = "Hello World" 

var range = str.rangeOfString("e") 

// returns error: String does not contain member named: rangeOfString() 

jedoch:

var str = "Hello World" as NSString 

var range = str.rangeOfString("e") 

// returns correct (2, 1) 

Fehle ich etwas?

+0

Eigentlich soll der erste Fall keinen Fehler zurück. Es sollte sein {Einige "1 .. <2"} –

+0

Die zweite sollte zurück (1,1) –

+1

Ich bin es nicht machen ... Es wird nicht funktionieren – Bren

Antwort

8

Sie haben bereits die Antwort in Ihrer Frage. Du verpasst die Besetzung. Wenn Swift Code zu schreiben, eine Aussage wie diese

var str = "Hello World" 

schafft einen Swift String, keine NSString. Um es als NSString arbeiten zu lassen, sollten Sie es vor der Verwendung auf NSString mit dem Operator as umwandeln.

Dies unterscheidet sich von dem Aufruf einer in Objective-C geschriebenen Methode und der Angabe eines String anstelle eines NSString als Parameter.

+1

Ich denke, meine Frage ist, dass die Dokumentation so klingt, als ob sie automatisch zwischen NSString und String überbrückt, was keinen Cast erfordert. Liest ich die Dokumentation falsch? – Bren

+2

Achten Sie auf diesen Teil.'Wenn Swift Objective-C-APIs importiert, werden alle NSString-Typen durch String-Typen ersetzt. Wenn Ihr Objective-C-Code eine Swift-Klasse verwendet, ersetzt das Importer alle String-Typen durch NSString in der importierten API. Dies bedeutet, dass Sie einer Methode, die einen 'NSString' erfordert, einen schnellen' String' geben können. versa. Es bedeutet nicht, dass Sie eine schnelle 'Zeichenfolge' erstellen können und sie so verwenden können, als ob sie überall eine 'NSString'-Variable wäre. –

+1

@Bren Swift wird automatisch überbrücken, wenn Sie eine 'String' an eine Methode übergeben, die einen' NSString' übernimmt. Aber es wird 'NSString's Methoden nicht zu' String' selbst hinzufügen. Diese automatische Überbrückung wird auch in Swift 1.2 entfernt. –

26

Um String-NSString zu gehen den folgenden Konstruktor verwenden:

let swiftString:String = "I'm a string." 
let objCString:NSString = NSString(string:swiftString) 

Mit Xcode 7 (Beta), einen niedergeschlagenen String-NSString, wie im folgenden Beispiel verwendet wird, in einer Warnmeldung führen , Aus 'String?' an unabhängigem Typen 'NSString' nicht immer:

let objcString:NSString = swiftString as! NSString // results in error 
0

ist hier Beispiel hierfür:

string str_simple = "HELLO WORLD"; 

//string to NSString 
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str() 
           encoding:[NSString defaultCStringEncoding]];    
NSLog(stringinObjC); 
+0

Sie konvertieren eine UTF-Zeichenfolge in ASCII und zurück und damit funktioniert dies nur mit ASCII-Zeichen, was später zu einem unangenehmen Fehler führen kann. –