A documentação do Swift diz que classes , structs e enums podem estar em conformidade com os protocolos e posso chegar a um ponto em que todos eles estão em conformidade. Mas não consigo fazer com que o enum se comporte exatamente como os exemplos de classe e estrutura :
protocol ExampleProtocol {
var simpleDescription: String { get set }
mutating func adjust()
}
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
enum SimpleEnum: ExampleProtocol {
case Base
var simpleDescription: String {
get {
return "A Simple Enum"
}
set {
newValue
}
}
mutating func adjust() {
self.simpleDescription += ", adjusted"
}
}
var c = SimpleEnum.Base
c.adjust()
let cDescription = c.simpleDescription
Não descobri como fazer simpleDescription
para mudar como resultado de uma ligação adjust()
. Meu exemplo obviamente não fará isso porque o getter tem um valor embutido no código, mas como posso definir um valor para o simpleDescription
enquanto ainda estou em conformidade com o ExampleProtocol
?
swift
enums
swift-protocols
Adrian Harris Crowne
fonte
fonte
adjust
função retornaVoid
noExampleProtocol
, é o mesmo que usarmutating func adjust()
. Se desejaradjust
ter um tipo de retorno, você pode alterar o protocolo para: gist.github.com/anjerodesu/e1bf640576a3b6fa415fcase .Base:
Aqui está minha opinião sobre isso.
Como se trata de um
enum
e não de umclass
, você deve pensar diferente (TM) : é a sua descrição que deve mudar quando o "estado" das suasenum
mudanças (como apontado por @ hu-qiang).Espero que ajude.
fonte
Aqui está outra abordagem, usando apenas o conhecimento adquirido com o passeio até aquele ponto *
Se você deseja que
adjust()
atue como um alternador (embora não haja nada que sugira que este seja o caso), use:* (Embora não mencione explicitamente como especificar um tipo de retorno e um protocolo)
fonte
Aqui está uma solução que não altera o valor enum atual, mas seus valores de instância (apenas no caso de ser útil para alguém).
fonte
self = copy(self, self.desc + ", asdfasdf")
Não é possível definir variáveis sem getter e setter em enums e, portanto, é impossível ter uma variável que você possa modificar.
Você pode estar em conformidade com o protocolo, mas não pode ter o mesmo comportamento com a mutação como nas classes.
fonte
É um link sobre enum in swift.
Estruturas e enumerações são tipos de valor. Por padrão, as propriedades de um tipo de valor não podem ser modificadas a partir de seus métodos de instância. ligação
Então, você tem que usar a função mutante.
fonte
Outra opção é ajustar () para alternar entre os casos da seguinte forma:
fonte
Aqui está a construção da resposta de Jack:
fonte
Eu vim com isso
fonte
aqui está meu código
fonte
Minha primeira contribuição aqui:
Obrigado pelos outros!
fonte
Esse experimento também me confundiu, devido aos exemplos anteriores de SimpleClass e SimpleStructure mostrando a propriedade simpleDescription sendo modificada internamente, o que me fez pensar que precisava fazer a mesma coisa. Depois de examinar as outras respostas postadas aqui e ler a documentação oficial do Apple Swift 2.1, eu descobri o seguinte:
Observe também que nos exemplos fornecidos pela Apple para SimpleClass e SimpleStructure antes deste experimento, a descrição simples é perdida internamente - você não pode obter o valor original de volta (a menos, é claro, que o salve fora da classe / estrutura); foi isso que me levou a criar um método restore () para o exemplo SimpleEnum, que permite alternar entre os valores. Espero que isso seja útil para alguém!
fonte
Eu estava pensando que o objetivo é simplesmente manter o estado e usar uma descrição para tornar o estado atual mais fácil de ler:
fonte
Outra variação: Usar valores associados para manter e exibir a opção anterior (da forma "Selecionado 1, ajustado de 2, ajustado de 1, ajustado de 2, ajustado de 1")
fonte
que tal agora
fonte