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.