Swift: CGRect, CGSize & CGPoint

Você está (provavelmente) fazendo isso errado

Andyy Esperança
Andyy Esperança

Siga

2 de Fevereiro, 2016 · 4 min de leitura

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 CGRects 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

Deixe uma resposta

O seu endereço de email não será publicado.