unavailable getheight example ios core-graphics

ios - getheight - Sintaxis de CGRect que no he visto antes



cgrectmake swift 4 (3)

Esa es la sintaxis del inicializador C99 . Puedes usarlo con cualquier estructura.

La principal ventaja de un Objective-C es que le proporciona una sintaxis muy similar a la de Objective-C, donde los campos están cerca de los valores en lugar de lo que implica el posicionamiento. (Eso no quiere decir que esto sea intencionalmente similar, o que sea la única ventaja. Pero es bueno).

A veces es un poco más de escritura, pero ahora lo uso en todas partes.

Considerar:

CGRect a = CGRectMake(a+c/2, b+d/2, c, d);

Para entender esto, necesitas entender el orden de los parámetros. También necesitas poder atrapar las comas fácilmente con tus ojos. En este caso, eso es bastante fácil, pero si las expresiones fueran más complicadas, probablemente las almacenaría primero en una variable temporal.

La forma C99:

CGRect a = (CGRect){ .origin.x = a+c/2, .origin.y = b+d/2, .size.width = c, .size.height = d };

Es más largo, pero es más explícito. También es muy fácil seguir lo que se asigna a qué, sin importar qué tan larga sea la expresión. También es más como un método Objective-C. Después de todo, si CGRect fuera una clase, probablemente se vería así:

CGRect *a = [[CGRect alloc] initWithOriginX:x originY:y width:w height:h];

También puedes hacer cosas como esta:

CGRect a = (CGRect){ .origin = myOrigin, .size = computedSize };

Aquí, estás construyendo un rectángulo usando un CGPoint y CGSize . El compilador entiende que .origin espera un CGPoint , y .size espera un CGSize . Usted ha proporcionado eso. Todo es salsa.

El código equivalente sería CGRectMake(myOrigin.x, myOrigin.y, size.width, size.height) . Al usar CGRectMake ya no estás expresando el mismo tipo de significado para el compilador. No puede impedir que asigne parte del tamaño al origen. Tampoco le impedirá asignar el ancho a la altura. Ni siquiera te da una buena idea de cuál es la X y la Y; Si has usado API que proporcionan coordenadas verticales primero, lo harás mal.

También puede asignar parte de una estructura y parte de flotadores:

CGRect a = (CGRect){ .origin = myOrigin, .size.width = c, .size.height = d };

La función CGRectMake es anterior a C99. No tengo evidencia a este efecto, pero creo que si C99 hubiera sido lo primero, CGRectMake probablemente no existiría en absoluto; es el tipo de función crujiente que escribes cuando tu idioma no tiene una forma directa de realizar la inicialización. Pero ahora lo hace.

Básicamente, si lo usas por un tiempo, es probable que prefieras la sintaxis C99. Es más explícito, más flexible, más parecido a Objective-C y más difícil de arruinar.

Desafortunadamente, a partir del 4.6 Xcode no autocompletará los nombres de los campos de la estructura cuando se encuentre en la lista de inicializadores del campo C99.

Vi la sintaxis a continuación en un código de ejemplo y no estoy seguro de entenderlo.

CGRect imageRect = (CGRect){.size = baseImage.size};

¿Es simplemente una forma abreviada de inicializar un CGRect equivalente a:

CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height);

¿Hay algún beneficio para esta sintaxis aparte de escribir un poco menos?


Esta no es solo una sintaxis abreviada, sino que también es útil cuando desea cambiar solo el tamaño y no el origen en CGRect y viceversa.

Por ejemplo: quiero cambiar solo el tamaño y la posición tiene una sintaxis complicada y no quiero cambiarla. Noramlly, yo haría

CGRect imageRect = CGRectMake(sprite.origin.x,sprite.origin.y,40, 60);

Con la otra sintaxis lo haría.

CGRect imageRect = (CGRect){.size = sprite.size};

También podemos usar directamente métodos de sumar, restar y multiplicar, por ejemplo.

CGRect imageRect = (CGRect){.size = ccpAdd(sprite.size,addsize)};

Espero que esto ayude