Con la introducción de Swift, he intentado entender el nuevo idioma
Soy un desarrollador de iOS y usaría tipos como NSString, NSInteger, NSDictionaryen 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 NSStringtiene una lengthpropiedad. 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, laStringfuncionalidad todavía es un poco limitada en la versión alfa, porNSStringlo 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 toNSString` ¡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
Foundationtipos.Si bien
StringyNSStringson en su mayoría intercambiables, es decir, puede pasarStringvariables a métodos que tomanNSStringpará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/NSDictionaryy los diversos tipos de números en Swift yNSNumberSiempre 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().lengthpor ejemplo. También puedes convertir unStringa unNSStringusandostr 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/NSStringbridge, 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
StringyNSStringson intercambiables, por lo que realmente no importa cuál uses. Siempre puedes lanzar entre los dos, usandoo incluso
NSIntegeres solo un alias para aninto along(dependiendo de la arquitectura), así que usaríaInt.NSDictionaryes un asunto diferente, ya queDictionaryes 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
IntEn el libro se indica que el tipo de datos de Swift es el mismo que el tamaño de la palabra de la arquitectura.NSIntegertambié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
NSStringmé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
NSStrings probablemente no se actualizará para lidiar con grupos de grafemas: rompería demasiadas aplicaciones que se basan en el comportamiento anterior. Además,NSString.lengthcuenta 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