O que é o switch?Switch é um comparador de resultados semelhante às estruturas if e else if porem, ele trabalha com uma mecânica um pouco diferente dessas citadas; funciona como um loop que verifica todos os possiveis resultados do primeiro ao último case ou default.
Qual a diferença entre o else if e o switch?Switch além de mais organizado é mais prático economizando e muito o uso de operadores relacionais além de ser de fácil compreensão, porem, em alguns códigos é mais aconselhável o uso do if para empregar estruturas não indicadas no switch.
Este é um exemplo de uma das formas de se fazer um /admins em if, elseif e em switch.
if (strcmp(cmdtext, "/admins", true) == 0)
{
for(new i = 0; i <= MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) == 1 && PlayerInfo[i][pAdmin] > 0)
{
if(PlayerInfo[i][pTrampo] == 1)
{
GetPlayerName(i, sendername, sizeof(sendername));
if(PlayerInfo[i][pAdmin] == 1)
{
format(string, sizeof(string), "Nome: %s [Moderador] (Trabalhando)", sendername);
SendClientMessage(playerid, COR_ADMINS, string);
}
if(PlayerInfo[i][pAdmin] == 2)
{
format(string, sizeof(string), "Nome: %s [Administração Nível 2] (Trabalhando)", sendername);
SendClientMessage(playerid, COR_ADMINS, string);
}
if(PlayerInfo[i][pAdmin] == 3)
{
format(string, sizeof(string), "Nome: %s [ Administração Nível 3] (Trabalhando)", sendername);
SendClientMessage(playerid, COR_ADMINS, string);
}
}
}
}
return 1;
}
O exemplo acima mostra como seria um /admins usando else if, veja como ficaria este comando usando switch abaixo
if(strcmp(cmdtext, "/admins", true) == 0)
{
for(new i, PP = GetMaxPlayers(); i < PP; i++)
{
switch(PlayerInfo[i][pAdmin])//Função a ser verificada
{
case 1: format(string, 256, "Nome: %s [Moderador] (Trabalhando)", sendername), SendClientMessage(playerid, COR_ADMINS, string); //Se a função verificada for igual a 1
case 2: format(string, 256, "Nome: %s [Administrador nível 2] (Trabalhando)", sendername), SendClientMessage(playerid, COR_ADMINS, string); //Se a função verificada for igual a 2
case 3: format(string, 256, "Nome: %s [Administrador nível 3] (Trabalhando)", sendername), SendClientMessage(playerid, COR_ADMINS, string); //Se a função verificada for igual a 3
default: /*Aqui a função a ser execultada caso nada se iguale aos resultados acima.*/
}
}
return 1;
}
Criando o seu switch:Crie seu switch com a função a ser verificada que quiser, mas siga este formato abaixo:
switch (Função) //Coloque por exemplo um PlayerInfo[player][info] ou qualquer outra coisa
{
case 1: O que deve ser executado caso seja igual a 1
case 2: O que deve ser executado caso seja igual a 2
case 3: O que deve ser executado caso seja igual a 3
default: O que deve ser executado caso não seja igual aos exemplos acima //Não obrigatório
}
Você pode também modificar a sequencia de case's para que ele possa procurar resultados diferentes pra executar a mesma ação.
case 1, 2, 3: //O que deve ser executado caso seja igual a 1, 2 ou 3
Veja um exemplo do mesmo código abaixo usado com if
if(Função == 1 || Função == 2 || Função == 3)
{
//O que deve ser executado caso a função seja igual a 1, 2 ou 3
return 1;
}
Você pode também verificar resultados de um numero à outro, como no exemplo abaixo.
case 1 .. 10: //O que deve ser executado caso o resultado se enquadre entre 1 e 10
Em if ficaria assim
if(Função >= 1 && Função <= 3)
{
//O que deve ser executado caso a Função se enquadre entre ou igual 1 ou 4
return 1;
}
Abaixo um exemplo bem distinto dos cases:
if (strcmp(cmdtext, "/org", true) == 0)
{
switch (PlayerInfo[playerid][pMembro])
{
case 1 .. 3:
{
SendClientMessage(playerid, Cor, "Você pertence a uma org igual ou entre 1 e 3");
}
case 7, 8, 10:
{
SendClientMessage(playerid, Cor, "Você pertence a org 7, 8 ou 10");
}
case 4:
{
SendClientMessage(playerid, Cor, "Você pertence a org 4");
}
default:
{
SendClientMessage(playerid, Cor, "Você pertence a uma org que não é 1, 2, 3, 4, 7, 8 ou 10");
}
}
return 1:
}