Con la introducción de Swift, he intentado entender el nuevo idioma
Soy un desarrollador de iOS y usaría tipos como NSString, NSInteger, NSDictionary
en una aplicación. Noté que en el libro electrónico "El lenguaje de programación Swift" de Apple, usan los tipos SwiftString, Int, Dictionary
He notado que los tipos Swift no tienen (o tienen un nombre diferente) algunas de las funciones que tienen los tipos Foundation. Por ejemplo NSString
tiene una length
propiedad. Pero no he podido encontrar uno similar para Swift String
.
Me pregunto, para una aplicación iOS, ¿debería seguir usando los tipos Foundation?
String
. Sin embargo, laString
funcionalidad todavía es un poco limitada en la versión alfa, porNSString
lo que se utilizará más por ahora. Esperamos que arreglen la API hasta GA.countElements(str)
para responder esa parte específica de su pregunta."foo".length" directly in Swift. An implicit cast to
NSString` ¡El compilador agrega para ti!Respuestas:
Debería utilizar los tipos nativos Swift siempre que sea posible. El lenguaje está optimizado para usarlos y la mayor parte de la funcionalidad está puenteada entre los tipos nativos y los
Foundation
tipos.Si bien
String
yNSString
son en su mayoría intercambiables, es decir, puede pasarString
variables a métodos que tomanNSString
parámetros y viceversa, algunos métodos parecen no estar puenteados 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 usocontainsString()
para verificar subcadenas. (Descargo de responsabilidad: soy el autor de ambas respuestas)No he explorado completamente otros tipos de datos, pero supongo que alguna versión de lo que se indicó anteriormente también será válida para
Array
/NSArray
,Dictionary
/NSDictionary
y los diversos tipos de números en Swift yNSNumber
Siempre que necesite usar uno de los tipos Foundation, puede usarlos para escribir variables / constantes explícitamente, como en
var str: NSString = "An NSString"
o usarbridgeToObjectiveC()
en una variable / constante existente de un tipo Swift, comostr.bridgeToObjectiveC().length
por ejemplo. También puedes convertir unString
a unNSString
usandostr as NSString
.Sin embargo, la necesidad de que estas técnicas utilicen explícitamente los tipos Foundation, o al menos algunos de ellos, puede quedar obsoleta en el futuro, ya que a partir de lo que se indica en la referencia del lenguaje, el
String
/NSString
bridge, por ejemplo, debería ser completamente transparente.Para una discusión detallada sobre el tema, consulte Uso de Swift con Cocoa y Objective-C: Trabajar con tipos de datos de Cocoa
fuente
bridgeToObjectiveC()
y explicación de la conexión entre NSString y Swift's String.NSString: crea objetos que residen en el montón y siempre se pasan por referencia.
Cadena: Es un tipo de valor cada vez que lo pasamos, se pasa por valor. como Struct y Enum, String en sí mismo es Struct en Swift.
Pero la copia no se crea cuando pasa. Crea una copia cuando lo mutas por primera vez.
La cadena se conecta automáticamente a Objective-C como NSString. Si la biblioteca estándar de Swift no lo tiene, necesita importar el marco Foundation para obtener acceso a los métodos definidos por NSString.
Swift String es muy poderoso y tiene una gran cantidad de funciones incorporadas.
Ahora String es capaz de realizar todas las operaciones que cualquiera puede realizar en el tipo de colección.
Para obtener más información, consulte los documentos de Apple.
fuente
Su mejor opción es usar tipos y clases nativos de Swift, ya que algunos otros han notado que NSString tiene una traducción gratuita a String, sin embargo, no son iguales al 100%, tome por ejemplo lo siguiente
debe usar el método count () para contar los caracteres en una cadena, también tenga en cuenta que nsstring.length devuelve 2, porque cuenta su longitud según UTF16.
Similar, SI Lo mismo, NO
fuente
String
yNSString
son intercambiables, por lo que realmente no importa cuál uses. Siempre puedes lanzar entre los dos, usandoo incluso
NSInteger
es solo un alias para anint
o along
(dependiendo de la arquitectura), así que usaríaInt
.NSDictionary
es un asunto diferente, ya queDictionary
es una implementación completamente separada.En general, me quedo con los tipos rápidos siempre que sea posible y siempre puede convertir entre los dos cuando lo necesite, utilizando el
bridgeToObjectiveC()
método proporcionado por las clases rápidas.fuente
Int
En el libro se indica que el tipo de datos de Swift es el mismo que el tamaño de la palabra de la arquitectura.NSInteger
también tiene el mismo tamaño que el tamaño de la palabra de la arquitectura.Dado que los tipos C objetivo todavía se envían dinámicamente, probablemente serán más lentos. Yo diría que es mejor utilizar los tipos nativos de Swift a menos que necesite interactuar con las API de objetivo-c
fuente
Utilice los tipos nativos Swift siempre que pueda. En el caso de String, sin embargo, tiene acceso "transparente" a todos los
NSString
métodos como este:fuente
Actualización de Swift 4
String recibe revisiones en Swift 4. Ahora puede llamar directamente a count y considerar los grupos de grafemas como 1 pieza, como un emoji. NSString no está actualizado y lo está contando de otra manera.
fuente
NSString
s probablemente no se actualizará para lidiar con grupos de grafemas: rompería demasiadas aplicaciones que se basan en el comportamiento anterior. Además,NSString.length
cuenta los caracteres UTF16.La cadena es una estructura
// en el módulo Swift
cadena de estructura pública
{
}
NSString es una clase
// en Foundation Module
clase abierta NSString: NSObject
{
}
fuente