Você está (provavelmente) fazendo isso errado
foi cerca de um sólido oito meses desde que eu primeiro decidi saltar completamente para o Swift buraco de minhoca. Ao longo desses meses aprendi lentamente a parar de escrever padrões de código de estilo Objective-C com sintaxe rápida, e comecei a tirar proveito da nova linguagem.
But one thing i’ve recently picked up on is that i’m still using ugly non-Swift-like syntax with all my CGGeometry
structures.
CGRect, CGSize, CGPoint
C sintaxe. A sheep in wolf’s clothing
i have a big feeling that a lot of Swift developers are going to be guilty of this. Levante a mão se você tem usado qualquer um destes no seu código:
Update: a partir do Swift 3, estas funções foram removidas.
Yea, I thought so. Mas não te preocupes, não é motivo para teres vergonha …ainda.
A coisa que está errada com isso é que ele quebra a Convenção de codificação do Swift, ele ainda vai funcionar, mas parece muito mais com algo que se ele pertence no Objective-C ou mesmo, atrevo-me a dizer, Java. * shudders *
para um desenvolvedor experiente iOS ou OSX, com um breve olhar eles poderiam facilmente dizer-lhe o que esse código está fazendo. Eles não precisam de rótulos de argumentos em estruturas CGGeometry
porque todos conhecem esses argumentos, e sua sequência desligada de cor. Exceto que eles não.
muito do que Swift é sobre é ser amigável para os recém-chegados da linguagem, bem como iniciantes de programação completa. Se eles olhassem para esse código, não teriam ideia do que esses números representam. Então vamos todos prometer ser bons cidadãos rápidos e começar a usar as versões Swift:
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)let size = CGSize(width: 100, height: 100)let point = CGPoint(x: 0, y: 0)
para um pouco de sintaxe extra, a verbosidade do nosso código é completamente compreensível à primeira vista. Além disso, um bônus de usar o CGGeometry
struct inicializador é que agora não estamos limitados ao uso de CGFloat
como argumentos, podemos também passar Int
e Double
!
Zero
let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero
Update: Como de Swift 3, estas funções foram removidos.
já que estamos nisso, você provavelmente ainda está usando estes também, amirite? lel.
devemos também estar atualizando estes para usar a sintaxe mais recente e mais rápida. Mas não se preocupe, a sintaxe é apenas mais um personagem. Consegues adivinhar o que é?
let rect = CGRect.zerolet size = CGSize.zerolet point = CGPoint.zero
outra coisa para o colocar a bordo com isto é que a sintaxe do marcador do Xcode irá, dependendo do seu esquema de cores, realçar o.zero
, tornando-o um pouco mais leve na sua carga cognitiva.
recuperação do valor
CGRect frame = CGRectMake(0, 0, 100, 100)CGFloat width = CGRectGetWidth(frame)CGFloat height = CGRectGetHeight(frame)CGFloat maxX = CGRectGetMaxX(frame)CGFloat maxY = CGRectGetMaxY(frame)
actualização: a partir do Swift 3, estas funções foram removidas.
Se você era ou ainda é um bom cidadão Objetivo-C, Você teria usado esses getters de valor quando você queria um valor específico do rect. Mas espera um segundo, porque não acedemos aos valores directamente?
CGFloat width = frame.size.widthCGFloat height = frame.size.height
por esta razão, as suas aplicações devem evitar ler e escrever directamente os dados armazenados na estrutura de dados do CGRect. Em vez disso, use as funções descritas aqui para manipular retângulos e recuperar suas características.
— Apple, CGGeometry Reference Documentation
provavelmente ainda há muitos de vocês que não se incomodaram com tais formalidades, mas está tudo bem. Swift nos aliviou de uma API tão impretty e, em vez disso, forneceu variáveis de notação de ponto simples.
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let width = frame.widthlet height = frame.heightlet maxX = frame.maxXlet maxY = frame.maxY
há muitos mais exemplos destas subtilezas disponíveis nos Parques Infantis Swift que eu forneci para complementar este post. O link estará no final da página.
mutabilidade
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let view = UIView(frame: frame)view.frame.origin.x += 10
não só é capaz de alterar os valores individuais da moldura de uma vista, como também é capaz de substituir as sub-estruturas inteiras completamente. Contemplem:
let view = UIView(frame: .zero)view.frame.size = CGSize(width: 10, height: 10)view.frame.origin = CGPoint(x: 10, y: 10)
Esta pequena característica por si só é suficiente para parar de usar Objective-C. mutabilidade em CGRect
s sem ter que criar uma nova inteiramente e reiniciar o valor. Foi apenas há menos de dois anos que nós, como desenvolvedores Objective-C, fomos forçados a escrever código de modificação de frames como este.:
CGRect frame = CGRectMake(0, 0, 100, 100);UIView *view = initWithFrame: frame];CGRect newFrame = view.frame;newFrame.size.width = view.frame.origin.x + 10;view.frame = newFrame;
I don’t know about you, but writing that really stressed me out. A criação de uma newFrame
struct a partir de view
‘s quadro, modificando-o e, em seguida, repor o frame
propriedade view
novamente. Não, obrigado, nunca mais, nunca mais, por favor.
não se esqueça de
Há também um par de outras construções dentro do UIKit para que estas alterações são aplicáveis a:
UIEdgeInsets var edgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
edgeInsets.top += 10UIOffsetvar offset = UIOffset(horizontal: 10, vertical: 10)
offset.vertical += 10