Estou tentando com essas linhas de código
class Student {
var name: String
var age: Int?
init(name: String) {
self.name = name
}
func description() -> String {
return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
}
}
var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())
O código acima produz como segue
Daniel hides his age.
Daniel is Optional(18) years old.
Minha dúvida é por que há opcional (18) lá, como posso remover o opcional e apenas impressão
Daniel is 18 years old.
if let age = age { return ""} else { return "" }
Many Swift beginners think var age: Int? means that age is an Int which may or may not have a value. But it means that age is an Optional which may or may not hold an Int.
Um opcional significa que o Swift não tem certeza se o valor corresponde ao tipo: por exemplo, Int? significa que Swift não tem certeza se o número é um Int.
1) Se você tiver certeza absoluta do tipo, pode usar um ponto de exclamação para forçar o desembrulhamento, assim:
Se você forçar o desempacotamento de um opcional e ele for igual a nulo, poderá encontrar este erro de falha:
Isso não é necessariamente seguro, então aqui está um método que pode evitar travamento caso você não tenha certeza do tipo e valor:
2) O Opcional Implicitamente Não Embalado
3) A declaração de guarda
A partir daqui, você pode seguir em frente e usar a variável desembrulhada. Certifique-se apenas de forçar o desempacotamento (com um!), Se tiver certeza do tipo da variável.
fonte
Para fins de teste / depuração, geralmente desejo gerar opcionais como strings sem sempre ter que testar os
nil
valores, então criei um operador personalizado.Melhorei ainda mais as coisas depois de ler essa resposta em outra pergunta .
Obviamente, o operador (e seus atributos) pode ser ajustado a seu gosto ou você pode torná-lo uma função. De qualquer forma, isso permite que você escreva um código simples como este:
Integrar a ideia de protocolo do outro fez com que funcionasse até mesmo com opcionais aninhados, que costumam ocorrer ao usar o encadeamento opcional. Por exemplo:
fonte
String
outro lugar (por exemplo, um log / mensagem de erro).Atualizar
Basta usar
me.age ?? "Unknown age!"
. Funciona no 3.0.2.Resposta Antiga
Sem forçar o desempacotamento (sem sinal mach / travamento se nulo), outra boa maneira de fazer isso seria:
(result["ip"] ?? "unavailable").description
.result["ip"] ?? "unavailable"
deveria ter trabalho também, mas não tem, não no 2.2 pelo menosClaro, substitua "indisponível" pelo que mais lhe convier: "nulo", "não encontrado" etc.
fonte
Para desembrulhar use opcional em
age!
vez deage
. Atualmente você está imprimindo um valor opcional que poderia sernil
. É por isso que está embrulhadoOptional
.fonte
Em swift
Optional
é algo que pode sernil
em alguns casos. Se você tiver 100% de certeza que avariable
terá algum valor sempre e não retornaránil
o add!
com a variável para forçar o desempacotamento.Em outro caso, se você não tiver muita certeza sobre o valor, adicione um
if let
bloco ouguard
para certificar-se de que o valor existe, caso contrário, pode resultar em um travamento.Para
if let
bloco:Para
guard
declaração:guard
é uma estrutura condicional para retornar o controle se a condição não for atendida.Eu prefiro usar
guard
overif let
block em muitas situações, pois nos permite retornar ofunction
se um determinado valor não existir. Como quando há uma função em que uma variável é integral para existir, podemos verificar se há uma instrução em guarda e o retorno dela não existe. ie;Se a variável existe, podemos usar 'abc' na função fora do escopo de guarda.
fonte
age
é um tipo opcional:Optional<Int>
então, se você comparar com nil, ele retornará false sempre que tiver um valor ou não. Você precisa desembrulhar o opcional para obter o valor.No seu exemplo, você não sabe se ele contém algum valor, então você pode usar isso:
fonte
Fiz isso para imprimir o valor da string (propriedade) de outro controlador de exibição.
ViewController.swift
SecondViewController.swift
Resultado:
fonte
Confira o
guard
depoimento:fonte
Ao ter um valor padrão:
print("\(name) is \(age ?? 0) years old")
ou quando o nome é opcional:
print("\(name ?? "unknown") is \(age) years old")
fonte
Eu estava recebendo o Optional ("String") em minhas células tableview.
A primeira resposta é ótima. E me ajudou a descobrir. Aqui está o que eu fiz, para ajudar os novatos como eu.
Como estou criando um array em meu objeto personalizado, sei que ele sempre terá itens na primeira posição, então posso forçar o desdobramento em outra variável. Em seguida, use essa variável para imprimir ou, no meu caso, defina como o texto da célula tableview.
Parece tão simples agora, mas demorei um pouco para descobrir.
fonte
Esta não é a resposta exata para essa pergunta, mas uma das razões para esse tipo de problema. No meu caso, não fui capaz de remover Optional de uma String com "if let" e "guard let".
Portanto, use AnyObject em vez de Any para remover o opcional de uma string rapidamente.
Por favor, consulte o link para a resposta.
https://stackoverflow.com/a/51356716/8334818
fonte