ios objective-c string macos swift

ios - Swift: ¿qué tipos usar? NSString o String



string swift 4 (7)

Swift 4 actualización

String obtiene revisiones en swift 4. Ahora puedes invocar directamente count y considerar racimos de grafema como 1 pieza, como un emoji. NSString no está actualizado y lo cuenta de otra manera.

var nsstring: NSString = "👩‍👩‍👧‍👦" var string: String = "👩‍👩‍👧‍👦" print(nsstring.length) // 11 print(string.count) // 1

Con la presentación de Swift, he estado tratando de entender el nuevo idioma

Soy un desarrollador de iOS y utilizaría tipos como NSString, NSInteger, NSDictionary en una aplicación. Me di cuenta de que en el libro electrónico "The Swift Programming Language" de Apple, utilizan Swift types String, Int, Dictionary

Me di cuenta de que los tipos Swift no tienen (o tienen un nombre diferente) algunas de las funciones que hacen los tipos de Fundación. Por ejemplo, NSString tiene una propiedad de length . Pero no he podido encontrar uno similar para Swift String .

Me pregunto, para una aplicación de iOS, ¿debería seguir utilizando los tipos de Fundación?


Debe usar los tipos nativos de Swift siempre que sea posible. El lenguaje está optimizado para usarlos, y la mayoría de la funcionalidad está puenteada entre los tipos nativos y los tipos de Foundation .

Si bien String y NSString son en su mayoría intercambiables, es decir, puede pasar las variables de String a métodos que toman los parámetros de NSString y viceversa, parece que algunos métodos no se puentean automáticamente a partir de este momento. Vea esta respuesta para una discusión sobre cómo obtener la longitud de una Cadena y esta respuesta para una discusión sobre el uso de containsString() para verificar las subcadenas. (Descargo de responsabilidad: soy el autor de estas dos respuestas)

No he explorado completamente otros tipos de datos, pero supongo que alguna versión de lo que se dijo anteriormente también será válida para Array / NSArray , Dictionary / NSDictionary y los diversos tipos de números en Swift y NSNumber

Siempre que necesite usar uno de los tipos de Fundación, puede usarlos para escribir variables / constantes explícitamente, como en var str: NSString = "An NSString" o use bridgeToObjectiveC() en una variable / constante existente de un tipo Swift, como en str.bridgeToObjectiveC().length por ejemplo. También puede convertir un String en un NSString usando str as NSString .

Sin embargo, la necesidad de estas técnicas para usar explícitamente los tipos Foundation, o al menos algunos de ellos, puede ser obsoleta en el futuro, ya que de lo que se dice en la referencia del lenguaje, el String / NSString bridge, por ejemplo, debería estar completamente sin costura.

Para una discusión a fondo sobre el tema, consulte Uso de Swift con Cocoa y Objective-C: Trabajar con tipos de datos de cacao


Debido a que los tipos C objetivo aún se envían dinámicamente, probablemente sean más lentos. Diría que lo mejor es que uses los tipos nativos de Swift a menos que necesites interactuar con las API de Object-c.


NSString: crea objetos que residen en el montón y siempre pasan por referencia.

Cadena: Es un tipo de valor cada vez que lo pasamos, es pasado por valor. como Struct y Enum. Pero la copia no se crea cuando pasas. Crea copia cuando la mudas por primera vez. Para obtener más información, consulte los documentos de Apple


Su mejor opción es utilizar clases y tipos nativos de Swift, ya que otros han notado que NSString tiene una traducción gratuita a String, sin embargo, no son lo mismo al 100%, tome por ejemplo lo siguiente

var nsstring: NSString = "/U0001F496" var string: String = "/U0001F496" nsstring.length count(string)

necesita utilizar el método count () para contar los caracteres en cadena, también tenga en cuenta que nsstring.length devuelve 2, ya que cuenta su longitud en función de UTF16.

Similar, SÍ Lo mismo, NO


Usa los tipos nativos de Swift siempre que puedas. En el caso de String, sin embargo, tiene acceso "sin NSString " a todos los métodos de NSString como este:

var greeting = "Hello!" var len = (greeting as NSString).length


String y NSString son intercambiables, por lo que no importa cuál uses. Siempre puedes lanzar entre los dos, usando

let s = "hello" as NSString

o incluso

let s: NSString = "hello"

NSInteger es solo un alias por un int o un long (dependiendo de la arquitectura), así que solo usaría Int .

NSDictionary es una cuestión diferente, ya que Dictionary es una implementación completamente separada.

En general, me quedaré con los tipos rápidos siempre que sea posible y siempre se puede convertir entre los dos cuando lo necesiten, utilizando el método bridgeToObjectiveC() proporcionado por las clases rápidas.