Eu tenho este loop for-in:
for button in view.subviews {
}
Agora quero que o botão seja convertido em uma classe personalizada para que possa usar suas propriedades.
Eu tentei isso: for button in view.subviews as AClass
Mas não funciona e me dá um erro:'AClass' does not conform to protocol 'SequenceType'
E eu tentei isso: for button:AClass in view.subviews
Mas também não funciona.
for-loop
swift
for-in-loop
Arbitur
fonte
fonte
for button in view.subviews as [AClass]
Respostas:
Para Swift 2 e posterior:
O Swift 2 adiciona padrões de caso a loops for , o que torna ainda mais fácil e seguro digitar cast em um loop for :
Por que isso é melhor do que o que você poderia fazer no Swift 1.2 e anteriores? Porque os padrões de caso permitem que você escolha seu tipo específico da coleção. Ele corresponde apenas ao tipo que você está procurando, portanto, se o seu array contiver uma mistura, você poderá operar apenas em um tipo específico.
Por exemplo:
Resultado:
Para Swift 1.2 :
Nesse caso, você está lançando
view.subviews
e nãobutton
, então precisa fazer o downcast para a matriz do tipo que deseja:Nota: Se o tipo de array subjacente não for
[AClass]
, isso irá travar. Isso é o que o!
onas!
está dizendo a você. Se você não tiver certeza sobre o tipo, pode usar um elenco condicionalas?
junto com a vinculação opcionalif let
:Para Swift 1.1 e anterior:
Nota: Isso também travará se as subvisualizações não forem todas do tipo
AClass
. O método seguro listado acima também funciona com versões anteriores do Swift.fonte
[ ]
entre colchetes exatamente como neste exemplo. Talvez seja só eu, mas pensei que fosse apenas uma escolha de formatação no exemplo de código no início :) Presumo que seja porque estamos lançando para um array.[Class]
Parece muito melhor do queArray<Class>
.Esta opção é mais segura:
ou maneira rápida:
fonte
Você também pode usar uma
where
cláusulafonte
button
dentro do corpo do loop, que é o objetivo das outras soluções. Portanto, isso só executará o corpo do loop em elementosview.subviews
que sãoUIButton
s, mas não ajuda, por exemplo, na chamada deAClass
métodos específicosbutton
.where
apenas guarda e não lança.where
pode ser mais elegante e legível para casos (trocadilhos não intencionais) em que você precisa apenas de um guarda booleano.As respostas fornecidas estão corretas, eu só queria adicionar isso como um acréscimo.
Ao usar um loop for com conversão de força, o código irá travar (como já mencionado por outros).
Mas em vez de usar uma cláusula if,
outra maneira é usar um loop while:
O que parece ser mais conveniente se alguns elementos (mas não todos) do array forem do tipo
AClass
.Embora, por enquanto (a partir do Swift 5), eu prefira o loop for-case:
fonte
A resposta fornecida por vacawama estava correta no Swift 1.0. E não funciona mais com o Swift 2.0.
Se você tentar, obterá um erro semelhante a:
No Swift 2.0, você precisa escrever como:
fonte
Você pode realizar o casting e estar seguro ao mesmo tempo com isto:
fonte