Frustrado com o Código Objective-C
-
19-09-2019 - |
Pergunta
Bem, eu comecei com a programação do iPod/iPhone usando o principal desenvolvimento do iPhone (O'Reilly) e estou digitando código fora do livro. Existem dois problemas, um está relacionado à programação e o outro não.
Não entendo o formato dos métodos Objective-C. Estou recebendo alguns erros agora, com base no código -fonte do livro. O que me leva à minha próxima edição.
Parte do código é buggy. Acho que sim, porque não conseguia fazer o código para executar sem modificá -lo. O livro tem alguns erros de digitação no texto, pois é uma primeira edição e outros enfeites, mas minha "consertando" o código tem a ver com isso?
Então... Para onde posso aprender mais sobre os métodos Objective-C e como eles funcionam em termos de estrutura e para onde vão o tipo de retorno e os argumentos?
Para aqueles com o livro, estou no meio do aplicativo Instatweet no início.
Obrigado.
Solução
Talvez uma comparação entre um idioma "Ci-Like" e OBJ-C seja útil-vamos com Java. Imagine uma classe de retângulo com um método de contratragem de contratempo. Assumiremos que temos uma instância de retângulo chamado Rect.
Em Java, a assinatura do método provavelmente seria
public void setBackgroundColor(int r, int g, int b) { ... }
No Objective-C, os argumentos fazem parte da assinatura do método, então pode ser
- (void)setBackgroundColorWithRed:(int)r green:(int)g blue:(int)b;
O "-" significa que é um método de instância na classe Retângulo. (void) é do tipo de retorno do método. Então veem os argumentos. Cada cólon define um argumento, que é digitado (cada arg é (int) neste exemplo).
Vamos comparar chamando esses métodos. Java:
rect.setBackgroundColor(255, 255, 0);
Obj-C:
[rect setBackgroundColorWithRed:255 green:255 blue:0];
Muitas pessoas tropeçam na sintaxe do OBJ-C-você não está sozinho. Espero que essa comparação deixe as coisas mais claras. Ele também exemplifica uma força linguística do Objective-C: na hora da chamada, fica claro quais são seus argumentos. Se eu estivesse lendo o código e visse o método Java sendo chamado, não seria óbvio que os argumentos são vermelhos, azuis e verdes. No OBJ-C, está dolorosamente claro que estamos definindo valores de cores individuais. É verdade que a maioria dos desenvolvedores pode adivinhar quais são os três argumentos para um método SetColor, mas os métodos mais complexos ficam confusos. Aqui está um método mais complexo definido em Java e Objective-C:
static Dog createDog( String name
, int age
, boolean isNeutered
, String ownerName
);
+ (Dog *)createDogNamed:(NSString *)name
age: (int) age
neutered:(BOOL) isNeutered
owner: (NSString *) owner;
Na hora da chamada:
Dog.createDog("Fluffy", 2, true, "Moshe");
[Dog createDogNamed:@"Fluffy" age:2 neutered:YES owner:@"Moshe"];
O Objective-C é mais detalhado, mas muito mais legível. No exemplo do Java, não está muito claro o que significam os argumentos "2" e "verdadeiros". Objective-C quase se lê como o inglês.
Outras pessoas publicaram links para guias mais detalhados, mas espero que isso o faça além dos obstáculos sintáticos o suficiente para tornar os links úteis. Fico feliz em responder a perguntas mais específicas que você tem. Na minha experiência, os novatos do OBJ-C têm um momento muito difícil com a sintaxe, e então cliqueS e parece brilhante. Mantenha-se firme!
Outras dicas
A definição de um método Objective-C é bastante direta. É bem parecido com uma definição regular de chamada de função C, na verdade. A grande adição é a opção de nomear os parâmetros. Aqui está um exemplo:
-(int)addX:(int)x toY:(int)y
{
return x + y;
}
Que você pode usar enviando uma mensagem para o objeto apropriado:
int z = [object addX:x toY:y];
Nesse caso, forneci os parâmetros e os argumentos os mesmos nomes, para deixar claro como as coisas se alinham. Você poderia fazer com a mesma facilidade:
int z = [object addX:4 toY:7];
E depois disso, z
será 11.
Confira a Apple's Introdução ao objetivo C.
O formato do método básico é
-(ReturnType *)methodName:(VariableType *)variableName{
}
Por exemplo:
-(NSString *)giveMeANewStringFromAnOldString:(NSString *)oldString{
}
Você também deve verificar o site do livro para a Errata.
Eu fiz a mesma coisa que você fez. Também peguei o primeiro livro de desenvolvimento da cabeça do iPhone (cobrindo o 3.1 SDK).
Executei todos os tutoriais e encontrei apenas 1 erro que fez meu aplicativo não funcionar (fiz uma anotação no meu livro, mas não consigo encontrá -lo agora ...).
Então, depois disso, percebi que tinha exatamente o mesmo problema que você está tendo com a sintaxe.
Peguei "Programação no Objective-C 2.0", de Stephen G. Kochan. (É simplesmente brilhante.) O livro é claro e conciso. Eu nem cheguei a 25% do livro e todas as minhas perguntas foram respondidas.
O código de leitura Objetivo-C me jogou por meses porque estou tão acostumado a uma sintaxe diferente que meu cérebro demorou um pouco para se ajustar à maneira como o Objective-C espera.
O que estou encontrando é o código Objective-C se torna realmente legível quando você envolve seu cérebro em torno dele. O exemplo de Carl Norum acima é uma grande demonstração de legibilidade.
[object addX:4 toY:7];
Não fica muito mais legível do que isso!
Também alguma terminologia é um pouco diferente. "Mensagens de um objeto" vs "chamando um método" me jogou por algumas semanas também.
Espero que a recomendação do livro ajude você, isso realmente me ajudou muito.
Existem ótimos recursos de aprendizado na Apple:
Aprendizagem Objetivo-C: Um primer
e
Diretrizes de codificação para cacau
Boa sorte!
Ler Cacau (R) Programação para Mac (R) OS X (3ª edição), é a Bíblia para Mac e Cacau.
Eu não tive nenhum problema, mas lembre -se de que a API está sempre avançando para que possa haver pequenas atualizações/alterações. Mas não encontrei nada que me impedisse de terminar todos os exemplos e exercícios de código.
Este é o livro para ler.