Atributos

Atributos

Existem dois recursos no Swift, que são usados ​​para decorar declarações e tipos. Os recursos fornecem mais informações sobre declarações e tipos. Por exemplo, uma função declarada usando o recurso discardableResult indica que, embora a função tenha um valor de retorno, se o valor de retorno não for usado, o compilador não gerará um aviso.

Você pode especificar um recurso da seguinte maneira, com o símbolo @ seguido pelo nome do recurso e quaisquer parâmetros recebidos pelo recurso:

@Nome da característica

@ Nome da característica (parâmetro da característica)

Alguns recursos declarados especificam mais informações sobre o recurso e como ele modifica uma declaração específica ao receber parâmetros. Os parâmetros dessas características são escritos entre parênteses e seu formato é definido pelas características às quais pertencem.

Características declaradas

O recurso de reivindicação pode ser aplicado apenas a reivindicações.

acessível

Quando o recurso disponível é usado em uma reivindicação, significa que o ciclo de vida da reivindicação é relativo a uma plataforma específica e a uma versão do sistema operacional.

O recurso disponível geralmente aparece com a lista de parâmetros, que possui pelo menos dois parâmetros de recurso, separados por vírgulas. Esses parâmetros começam com um dos seguintes nomes de plataforma:

iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS watchOSApplicationExtension tvOS tvOSApplicationExtension swift 

Obviamente, você também pode usar um asterisco (*) para indicar todas as plataformas mencionadas acima. Especifique o parâmetro de recurso disponível da versão Swift, que não pode ser representada por um asterisco.

Os parâmetros restantes podem aparecer em qualquer ordem e informações adicionais sobre o ciclo de vida declarado podem ser adicionadas, incluindo eventos importantes.

O parâmetro indisponível indica que a instrução é inválida na plataforma especificada. Este parâmetro não pode ser usado ao especificar a disponibilidade da versão Swift. O parâmetro introduzido indica a versão a partir da qual a plataforma apresentará a instrução. O formato é o seguinte: introduzido: número da versão

O número da versão consiste em um a três números inteiros positivos, separados por pontos.

O parâmetro preterido indica a partir de qual versão a plataforma preteriu a declaração. O formato é o seguinte: obsoleto: número da versão

O número da versão opcional consiste em um ou mais números inteiros positivos, separados por pontos. A omissão do número da versão indica que a instrução está atualmente obsoleta e nenhuma informação relevante é fornecida quando a depreciação ocorre. Se você omitir o número da versão, os dois pontos (:) também podem ser omitidos.

O parâmetro obsoleto indica qual versão da plataforma ou idioma especificado será obsoleta. Quando uma instrução é descartada, ela é removida da plataforma ou idioma e não pode mais ser usada. O formato é o seguinte: obsoleto: número da versão

O número da versão consiste em um a três números inteiros positivos, separados por pontos.

O parâmetro de mensagem é usado para fornecer informações de texto. Ao usar uma instrução obsoleta ou obsoleta, o compilador emitirá uma mensagem de aviso ou erro. O formato é o seguinte: message: message content

O conteúdo da informação consiste em uma sequência de caracteres.

O parâmetro renomeado é usado para fornecer informações de texto para indicar o novo nome da instrução renomeada. Ao usar o nome antigo declarado, o compilador relatará um erro e solicitará o novo nome. O formato é o seguinte: renomeado: novo nome

O novo nome consiste em uma sequência.

Você pode usar o parâmetro renomeado e o parâmetro indisponível para o recurso disponível para indicar a disponibilidade da declaração em diferentes plataformas e versões Swift. Como mostrado abaixo, significa que o nome declarado mudou entre os diferentes releases de uma estrutura ou biblioteca. Essa combinação indica um erro de compilação no qual a instrução foi renomeada.

// 首发版本
protocol MyProtocol {
    // 这里是协议定义
}
// 后续版本重命名了 MyProtocol protocol MyRenamedProtocol {  // 这里是协议定义 } @available(*, unavailable, renamed:"MyRenamedProtocol") typealias MyProtocol = MyRenamedProtocol 

Você pode usar vários recursos disponíveis em uma instrução para especificar a disponibilidade da instrução em diferentes plataformas e versões Swift. O compilador usará o recurso disponível apenas se corresponder à versão da plataforma ou idioma especificada no recurso disponível.

Se o recurso disponível especificar apenas um parâmetro introduzido, além do parâmetro nome da plataforma, você poderá usar a seguinte sintaxe abreviada:

@available (número da versão do nome da plataforma, *)

@disponível (número da versão rápida)

A sintaxe abreviada do recurso disponível pode expressar de forma concisa a disponibilidade da instrução em várias plataformas. Embora esses dois formulários sejam funcionalmente iguais, use o formulário de sintaxe abreviada sempre que possível.

@available(iOS 10.0, macOS 10.12, *)
class MyClass {
    // 这里是类定义
}
当 available 特性需要同时指定 Swift 版本和平台可用性,需要使用单独的 available 特性来声明。  @available(swift 3.0.2) @available(macOS 10.12, *) struct MyStruct {  // 这里是结构体定义 } discardableResult

Esse recurso é usado nas declarações de função ou método para suprimir o aviso de que o valor de retorno da função ou método no compilador é chamado sem usar o resultado.

dynamicCallable

Esse recurso é usado em classes, estruturas, enumerações ou protocolos para tratar instâncias desse tipo como funções que podem ser chamadas. Esse tipo deve implementar um dos métodos dynamicallyCall (withArguments :), dynamicallyCall (withKeywordArguments :), ou ambos.

Você pode chamar uma instância do recurso dynamicCallable, assim como chamar uma função com qualquer número de parâmetros.

@dynamicCallable
struct TelephoneExchange {
    func dynamicallyCall(withArguments phoneNumber: [Int]) {
        if phoneNumber == [4, 1, 1] {
 print("Get Swift help on forums.swift.org")  } else {  print("Unrecognized number")  }  } }  let dial = TelephoneExchange()  // 使用动态方法调用 dial(4, 1, 1) // 打印“Get Swift help on forums.swift.org”  dial(8, 6, 7, 5, 3, 0, 9) // 打印“Unrecognized number”  // 直接调用底层方法 dial.dynamicallyCall(withArguments: [4, 1, 1]) 

A declaração do método dynamicallyCall (withArguments :) deve ter pelo menos um parâmetro que segue o protocolo ExpressibleByArrayLiteral, como [Int], e o tipo de valor de retorno pode ser de qualquer tipo.

@dynamicCallable
struct Repeater {
    func dynamicallyCall(withKeywordArguments pairs: KeyValuePairs<String, Int>) -> String {
        return pairs
 .map { label, count in  repeatElement(label, count: count).joined(separator: " ")  }  .joined(separator: "\n")  } }  let repeatLabels = Repeater() print(repeatLabels(a: 1, b: 2, c: 3, b: 2, a: 1)) // a // b b // c c c // b b // a 

A declaração do método dynamicallyCall (withKeywordArguments :) deve ter pelo menos um parâmetro que segue o protocolo ExpressibleByDictionaryLiteral, e o valor de retorno pode ser de qualquer tipo. A chave do parâmetro deve seguir o protocolo ExpressibleByStringLiteral. O exemplo acima usa KeyValuePairs como o tipo de parâmetro, para que o chamador possa passar rótulos de parâmetro repetidos, e aeb são usados ​​várias vezes na chamada para repetir.

Se você implementar dois métodos dynamicallyCall ao mesmo tempo, quando o argumento da palavra-chave for incluído na chamada do método, o método dynamicallyCall (withKeywordArguments :) será chamado, caso contrário, o método dynamicallyCall (withArguments :) será chamado.

Você pode chamar apenas instâncias de chamada dinâmica cujos parâmetros e valores de retorno correspondem à implementação do método dynamicallyCall. A chamada no exemplo abaixo não pode ser compilada porque sua implementação dynamicallyCall (withArguments :) não aceita os parâmetros KeyValuePairs <String, String>.

repeatLabels (a: "four") // Erro dynamicMemberLookup

Esse recurso é usado para classes, estruturas, enumerações ou protocolos, permitindo encontrar membros em tempo de execução. Esse tipo deve implementar o subscrito (dynamicMemberLookup :) subscript.

Em uma expressão de membro explícita, se nenhum membro for especificado por nome, a expressão será entendida como uma chamada para o subscrito (dynamicMemberLookup :) do tipo, transmitindo um argumento contendo a cadeia de nome do membro. O parâmetro de recebimento de subscrito pode ser um caminho de chave ou uma sequência de nome de membro; se você implementar os dois métodos de chamada de subscrito ao mesmo tempo, o método do parâmetro de caminho de chave prevalecerá.

A implementação subscrito (dynamicMemberLookup :) permite receber parâmetros do caminho-chave do tipo KeyPath, WritableKeyPath ou ReferenceWritableKeyPath. De acordo com o protocolo ExpressibleByStringLiteral, o parâmetro de recebimento de chamada subscrita é um nome de membro string - na maioria dos casos, o parâmetro subscrito é um valor String. O tipo de valor de retorno subscrito pode ser qualquer tipo.

Encontrar membros dinamicamente com base nos nomes dos membros pode nos ajudar a criar um tipo de wrapper que agrupe dados, mas esse tipo não pode ser verificado no tipo em tempo de compilação, como quando dados em outros idiomas são ligados ao idioma Swift. Por exemplo:

@dynamicMemberLookup
struct DynamicStruct {
    let dictionary = ["someDynamicMember": 325,
                      "someOtherMember": 787]
 subscript(dynamicMember member: String) -> Int {  return dictionary[member] ?? 1054  } } let s = DynamicStruct()  // 使用动态成员查找 let dynamic = s.someDynamicMember print(dynamic) // 打印“325”  // 直接调用底层下标 let equivalent = s[dynamicMember: "someDynamicMember"] print(dynamic == equivalent) // 打印“true” 

Encontre dinamicamente membros com base no caminho da chave, que pode ser usado para criar um tipo de pacote que agrupa dados, que é verificado no tipo em tempo de compilação. Por exemplo:

struct Point { var x, y: Int }

@dynamicMemberLookup
struct PassthroughWrapper<Value> {
 var value: Value  subscript<T>(dynamicMember member: KeyPath<Value, T>) -> T {  get { return value[keyPath: member] }  } }  let point = Point(x: 381, y: 431) let wrapper = PassthroughWrapper(value: point) print(wrapper.x) GKInspectable

Aplique essa propriedade para expor uma propriedade personalizada do componente GameplayKit à interface do usuário do editor SpriteKit.

inlinável

Esse recurso é usado na declaração de funções, métodos, atributos calculados, subscritos, construtores ou destruidores de conveniência para expor a implementação da declaração como parte da interface pública do módulo. O compilador permite que o símbolo embutido seja substituído por uma cópia da implementação do símbolo na chamada.

O código embutido pode interagir com símbolos no nível de acesso público em qualquer módulo, bem como símbolos no nível de acesso interno que marcam o recurso usableFromInline no mesmo módulo. O código embutido não pode interagir com símbolos de nível privado ou privado.

Esse recurso não pode ser usado para declarações aninhadas em funções, nem para declarações de níveis de acesso privado ou privado. As funções e fechamentos definidos nas funções embutidas são implicitamente não embutidos, mesmo que não possam marcar o recurso.

nonobjc

Esse recurso é usado para declarações de método, propriedade, subscrito ou construtor.Essas declarações podem ter sido usadas no código Objective-C, enquanto o recurso nonobjc informa ao compilador que essa declaração não pode ser usada no código Objective-C.

Esse recurso é usado em extensões e tem o mesmo efeito que adicionar esse recurso a cada membro em extensões que não são explicitamente marcadas como recursos objc.

Você pode usar o recurso nonobjc para resolver o problema de loop do método bridge na classe rotulada obj.Este recurso também permite sobrecarregar os construtores e métodos na classe rotulada objc.

Métodos marcados com características nonobjc não podem substituir métodos marcados com características objc. No entanto, métodos marcados com características objc podem substituir métodos marcados com características nonobjc. Da mesma forma, os métodos marcados com o recurso nonobjc não podem atender aos requisitos do método no protocolo marcado com o recurso @objc.

NSApplicationMain

O uso desse recurso em uma classe indica que a classe é uma classe de delegado de aplicativo.O uso desse recurso tem o mesmo efeito que chamar a função NSApplicationMain ( : :) e transmitir o nome da classe como o nome da classe delegada para a função.

Se você não quiser usar esse recurso, poderá fornecer um arquivo main.swift e chamar a função NSApplicationMain ( : :) no nível superior do código , conforme mostrado abaixo:

importar AppKit NSApplicationMain (CommandLine.argc, CommandLine.unsafeArgv) NSCopying

Esse recurso é usado para modificar os atributos da variável de armazenamento de uma classe. Esse recurso fará com que o método de configuração da propriedade use a cópia do valor recebido para atribuição, e esse valor é retornado pelo método copyWithZone (_ :) do valor recebido. O tipo desse atributo deve estar em conformidade com o protocolo NSCopying.

O comportamento do recurso NSCopying é semelhante ao recurso de cópia no Objective-C.

NSManaged

Esse recurso é usado para modificar métodos de instância ou atributos de variáveis ​​armazenadas nas subclasses NSManagedObject, indicando que sua implementação é fornecida dinamicamente pelo Core Data em tempo de execução, com base na descrição da entidade relevante. Os Dados Principais também fornecem armazenamento para atributos marcados com características do NSManaged em tempo de execução. A aplicação desse recurso também significa o recurso objc.

objc

Esse recurso é usado para decorar qualquer declaração que possa ser expressa em Objective-C. Por exemplo, classes não aninhadas, protocolos, enumerações não genéricas (apenas enumerações cujos valores originais são números inteiros), atributos e métodos (incluindo métodos de acesso), construtores, destruidores e os Operador padrão. O recurso objc informa ao compilador que esta declaração pode ser usada no código Objective-C.

Esse recurso é usado em extensões e tem o mesmo efeito que adicionar esse recurso a cada membro em extensões que não são explicitamente marcadas como nãoobjc.

O compilador inclui implicitamente o atributo objc nas subclasses de qualquer classe definida em Objective-C. No entanto, as subclasses não podem ser genéricas e não podem herdar de nenhuma classe genérica. Você pode adicionar explicitamente o atributo objc às subclasses que atendem a essas condições para especificar o nome do Objective-C, conforme descrito abaixo. Protocolos com objc adicionado não podem herdar de protocolos sem esse recurso.

O recurso objc é adicionado implicitamente nos seguintes casos.

A classe pai possui o recurso objc e é reescrita como uma declaração de subclasse. Siga a declaração com o contrato de recurso objc. Declaração com os recursos IBAction, IBSegueAction, IBOutlet, IBDesignable, IBInspectable, NSManaged ou GKInspectable. Se você aplicar o recurso objc às enumerações, cada caso de uso de enumeração será exposto no código Objective-C em uma combinação de nome de enumeração e nome de caso de uso. Por exemplo, há um caso de uso chamado Venus na enumeração Planet, que é chamado PlanetVenus quando é exposto no código Objective-C.

O atributo objc possui um parâmetro opcional, que consiste em um identificador. Você pode usar esse parâmetro de recurso quando desejar expor a entidade modificada por objc para Objective-C com um nome diferente. Você pode usar esse parâmetro para nomear classes, tipos enumerados, casos de uso enumerados, protocolos, métodos, métodos de acesso e construtores. Se você deseja especificar o nome de uma classe, protocolo ou enumeração em Objective-C, o nome contém um prefixo de três letras, como a convenção na programação de Objective-C. O exemplo a seguir expõe o método de valor do atributo ativado em ExampleClass a Objective-C. O nome é isEnabled em vez de seu nome de atributo original.

classe ExampleClass: NSObject {@objc var ativado: Bool {@objc (isEnabled) get {// retorna o valor apropriado}}} objcMembers

Esse recurso é usado nas declarações de classe para aplicar o recurso objc a todos os membros compatíveis com Objective-C dessa classe, extensões, subclasses e extensões de subclasse.

A maioria dos códigos deve usar o recurso objc para expor a declaração necessária. Se você precisar expor várias declarações, poderá agrupá-las em extensões que adicionam o recurso objc. O recurso objcMembers facilita um grande número de bibliotecas que usam as ferramentas de introspecção do tempo de execução do Objective-C. Adicionar recursos objc desnecessários aumentará o volume binário e afetará o desempenho.

required_stored_property_inits

Esse recurso é usado nas declarações de classe para exigir que todas as propriedades armazenadas na classe forneçam valores padrão como parte de sua definição. O atributo NSManagedObject é inferido para qualquer classe herdada dele.

testável

Esse recurso é usado para modificar a instrução de importação ao importar módulos de compilação que permitem testes, para que quaisquer entidades marcadas com um modificador de nível de acesso interno no módulo importado possam ser acessadas como se fossem marcadas com um modificador de nível de acesso público. Os testes também podem acessar classes e membros da classe marcados com modificadores de nível de acesso interno ou público, como se fossem declarados com modificadores de acesso aberto.

UIApplicationMain

O uso desse recurso em uma classe indica que a classe é uma classe de delegado de aplicativo.O uso desse recurso tem o mesmo efeito que chamar a função UIApplicationMain e passar o nome da classe como o nome da classe de delegado para a função.

Se você não quiser usar este recurso, você pode fornecer um arquivo de main.swift e chamar UIApplicationMain (nível superior de código : : : :) função. Por exemplo, se seu aplicativo usa um costume herdado do UIApplication sub-classe como a classe principal, você pode chamar o UIApplicationMain ( : : : :) função em vez de usar esse recurso.

usableFromInline

Esse recurso é usado na declaração de funções, métodos, propriedades calculadas, subscritos, construtores ou destruidores para permitir que o símbolo seja usado para declaração de código embutido no mesmo módulo. A declaração deve ter um modificador de nível de acesso interno.

Como o modificador de acesso público, esse recurso expõe a declaração como parte da interface pública do módulo. Diferentemente do público, o compilador não permite que o código fora do módulo faça referência à declaração da tag usableFromInline por nome, mesmo que o símbolo da declaração seja exportado, ele não poderá ser referenciado. No entanto, o código fora do módulo ainda pode trocar símbolos de declaração durante o tempo de execução.

As declarações marcadas como inlináveis ​​podem ser usadas implicitamente no código embutido. Embora inlinable ou usableFromInline possa ser usado para declarações internas, elas não podem ser usadas ao mesmo tempo.

warn_unqualified_access

Esse recurso se aplica a funções de nível superior, métodos de instância, métodos de classe ou métodos estáticos para acionar um aviso quando a função ou método é usado sem um qualificador anterior (como nome do módulo, nome do tipo, variável de instância ou constante). O uso desse recurso pode ajudar a reduzir a ambiguidade no acesso a funções com o mesmo nome na mesma função.

Por exemplo, a biblioteca padrão Swift inclui min ( : :) funções de nível superior e min () métodos para elementos de comparação de sequência. A declaração do método de sequência usa warn_unqualified_access para reduzir a ambiguidade de usá-los nas extensões de sequência.

Recursos declarativos usados ​​pelo Interface Builder

O recurso Interface Builder é um recurso declarativo usado pelo Interface Builder para sincronizar com o Xcode. O Swift fornece os seguintes recursos do Interface Builder: IBAction, IBSegueAction, IBOutlet, IBDesignable e IBInspectable. Esses recursos são conceitualmente os mesmos que os correspondentes no Objective-C.

IBOutlet e IBInspectable são usados ​​para decorar a declaração de atributo de uma classe, o recurso IBAction é usado para decorar a declaração de método de uma classe e o IBDesignable é usado para decorar a declaração da classe.

A aplicação dos recursos IBAction, IBSegueAction, IBOutlet, IBDesignable ou IBInspectable significa aplicar recursos objc ao mesmo tempo.

Características do tipo

As características de tipo podem ser usadas apenas para modificar tipos.

autoclosure

Esse recurso atrasa a avaliação da expressão, encapsulando automaticamente a expressão em um fechamento sem parâmetros. Ele pode modificar os parâmetros de função do tipo tipo de função sem parâmetros que retorna o tipo de resultado da expressão. Para obter exemplos de como usar o recurso de fechamento automático, consulte Fechos automáticos e tipos de função.

convenção

Esse recurso é usado para modificar o tipo de função; ele indica a convenção de chamada da função.

O recurso de convenção sempre aparece com um dos seguintes parâmetros.

O parâmetro swift é usado para representar uma referência de função Swift. Esta é a convenção de chamada padrão para valores de função no Swift.

O parâmetro block é usado para indicar uma referência de bloco compatível com Objective-C. O valor da função é usado como referência a um objeto de bloco, que é um objeto Objective-C compatível com id no qual a função de chamada está incorporada. A função de chamada usa a convenção de chamada de C.

O parâmetro c é usado para representar uma referência de função C. O valor da função não possui contexto nem função de captura e também usa a convenção de chamada C.

As funções que usam a convenção de chamada de função C também podem ser usadas como funções usando a convenção de chamada de bloco de Objective-C, e as funções que usam a convenção de chamada de bloco de Objective-C também podem ser usadas como funções usando a convenção de chamada de função Swift. No entanto, apenas funções globais não genéricas, funções locais e fechamentos que não capturam nenhuma variável local podem ser usadas como funções usando a convenção de chamada da função C.

escapando

Use esse recurso nas declarações de função ou método, o que significa que os parâmetros não serão armazenados para execução atrasada, o que garantirá que os parâmetros não excedam o ciclo de vida da chamada de função. Não há necessidade de usar explicitamente o self ao acessar propriedades e métodos em tipos de função que usam escape para declarar recursos.

Acho que você gosta

Origin www.cnblogs.com/liuxiaokun/p/12684726.html
Recomendado
Clasificación