Com a introdução do Swift, tenho tentado entender a nova linguagem
Sou um desenvolvedor iOS e usaria tipos como NSString, NSInteger, NSDictionary
em um aplicativo. Notei que no e-book "The Swift Programming Language" da Apple, eles usam os tipos SwiftString, Int, Dictionary
Percebi que os tipos Swift não têm (ou têm nomes diferentes) algumas das funções que os tipos Foundation têm. Por exemplo, NSString
tem uma length
propriedade. Mas não consegui encontrar um semelhante para o Swift String
.
Estou pensando: para um aplicativo iOS, ainda devo usar os tipos Foundation?
String
. No entanto, aString
funcionalidade ainda é um pouco limitada na versão alfa, portanto,NSString
será mais usada por enquanto. Esperamos que eles consertem a API até GA.countElements(str)
para responder a essa parte específica de sua pergunta."foo".length" directly in Swift. An implicit cast to
NSString` é adicionado para você pelo compilador!Respostas:
Você deve usar os tipos nativos Swift sempre que possível. A linguagem é otimizada para usá-los e a maior parte da funcionalidade é interligada entre os tipos nativos e os
Foundation
tipos.Embora
String
eNSString
sejam quase sempre intercambiáveis, ou seja, você pode passarString
variáveis para métodos que usamNSString
parâmetros e vice-versa, alguns métodos parecem não ter uma ponte automática neste momento. Veja esta resposta para uma discussão sobre como obter o comprimento de uma String e esta resposta para uma discussão sobrecontainsString()
como verificar se há substrings. (Isenção de responsabilidade: sou o autor de ambas as respostas)Eu não explorei totalmente outros tipos de dados, mas presumo que alguma versão do que foi declarado acima também se aplica a
Array
/NSArray
,Dictionary
/NSDictionary
e os vários tipos de número em Swift eNSNumber
Sempre que você precisar usar um dos tipos Foundation, você pode usá-los para digitar variáveis / constantes explicitamente, como em
var str: NSString = "An NSString"
ou usarbridgeToObjectiveC()
em uma variável / constante existente de um tipo Swift, como emstr.bridgeToObjectiveC().length
por exemplo. Você também pode lançar umString
para umNSString
usandostr as NSString
.No entanto, a necessidade dessas técnicas de usarem explicitamente os tipos Foundation, ou pelo menos alguns deles, pode se tornar obsoleta no futuro, uma vez que, pelo que está declarado na referência da linguagem, a ponte
String
/NSString
, por exemplo, deve ser completamente transparente.Para uma discussão completa sobre o assunto, consulte Using Swift with Cocoa e Objective-C: Working with Cocoa Data Types
fonte
bridgeToObjectiveC()
e explicação da conexão entre NSString e Swift's String.NSString: cria objetos que residem em heap e sempre são passados por referência.
String: É um tipo de valor sempre que o passamos, é passado por valor. como Struct e Enum, o próprio String é um Struct em Swift.
Mas a cópia não é criada quando você passa. Ele cria uma cópia quando você a altera pela primeira vez.
String é automaticamente ligada a Objective-C como NSString. Se a Biblioteca Padrão Swift não tiver, você precisa importar a estrutura Foundation para obter acesso aos métodos definidos por NSString.
Swift String é muito poderoso, tem uma infinidade de funções embutidas.
Agora String é capaz de realizar todas as operações que qualquer um pode realizar no tipo Collection.
Para obter mais informações, consulte os documentos da apple.
fonte
Sua melhor aposta é usar classes e tipos nativos Swift, como alguns outros notaram que NSString tem tradução gratuita para String, no entanto, eles não são 100% iguais, tome por exemplo o seguinte
você precisa usar o método count () para contar os caracteres em string, observe também que nsstring.length retorna 2, porque conta seu comprimento com base em UTF16.
Semelhante, SIM O mesmo, NÃO
fonte
String
eNSString
são intercambiáveis, então realmente não importa qual você usar. Você sempre pode lançar entre os dois, usandoou mesmo
NSInteger
é apenas um alias para umint
ou umlong
(dependendo da arquitetura), então eu apenas usariaInt
.NSDictionary
é um assunto diferente, poisDictionary
é uma implementação completamente separada.Em geral, preferiria os tipos swift sempre que possível e você sempre pode converter entre os dois quando necessário, usando o
bridgeToObjectiveC()
método fornecido pelas classes swift.fonte
Int
tipo de dados do Swift é declarado, no livro, como sendo o mesmo que o tamanho da palavra da arquitetura.NSInteger
também é do mesmo tamanho que o tamanho da palavra da arquitetura.Como os tipos C objetivos ainda são despachados dinamicamente, provavelmente serão mais lentos. Eu diria que você é melhor servido usando os tipos nativos Swift, a menos que precise interagir com APIs objetivas-c
fonte
Use os tipos nativos Swift sempre que puder. No caso de String, entretanto, você tem acesso "contínuo" a todos os
NSString
métodos como este:fonte
Atualização do Swift 4
String obtém revisões no swift 4. Agora você pode chamar diretamente a contagem e considerar os agrupamentos de grafemas como uma peça, como um emoji. NSString não é atualizado e está contando de outra forma.
fonte
NSString
s provavelmente não será atualizado para lidar com clusters de grafemas: isso interromperia muitos aplicativos que dependem do comportamento antigo. Além disso,NSString.length
conta os caracteres UTF16.String é uma estrutura
// no módulo Swift
public struct String
{
}
NSString é uma classe
// no módulo base
abrir classe NSString: NSObject
{
}
fonte