cast NSString! String en swift
J'ai un exemple de nom de variable dans la Chaîne de
var name: String
Ma classe implémente l'NSCoding protocole. Donc, pour le nom, j'ai eu
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: kName)
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey(kName) as String //CRASH HERE
}
Résultat? J'ai été d'obtenir un temps de fonctionnement de crash lors de l'initiation avec décodeur. J'ai changé init:
var temp = aDecoder.decodeObjectForKey(kName) as NSString!
self.name = aDecoder.decodeObjectForKey(kName) as String
et réalisé la valeur temp est tenue le droit NSString valeur. j'ai donc pensé que la ligne ci-dessous pour le réparer, mais il émet une erreur de l'éditeur de liens:
self.name = aDecoder.decodeObjectForKey(kName) as NSString!
les questions est de savoir comment prendre le temp et le mettre dans le nom?
Essayez:
Merci pour la réponse, mais il se bloque toujours.
self.name = aDecoder.decodeObjectForKey(kName) as AnyObject! as String
Merci pour la réponse, mais il se bloque toujours.
OriginalL'auteur Arash | 2014-09-20
Vous devez vous connecter pour publier un commentaire.
decodeObjectForKey
renvoie une optionAnyObject?
, de sorte que vous avez à protéger votre code contre possible néant valeurs. À l'aide d'un plâtre pour une forcés déballé n'est pas son fort.Je n'arrive pas à reproduire l'erreur (de sorte que le problème pourrait être quelque part d'autre dans votre code), mais c'est la façon dont je l'approche lors de l'initialisation de la
name
propriété:Remarque l'utilisation de l'option de passer
as?
, qui produit toujours un résultat (nul ou d'un type valide de valeur), par opposition àas NSString!
, ce qui déclenche une exception si les humbles n'est pas possible (par exemple, si vous vous attendez d'une chaîne, mais c'est un int à la place).Que le code serait également vous permettre de débogage - si
tempName
estnil
, puis la clé n'existe pas, ou la valeur correspondante est d'un type différent.self.name = tempName ?? "some initial value"
Ouais bon conseil. Je n'ai pas l'utiliser seulement pour des raisons de clarté, mais je n'ai même pas de mention 🙂
merci pour la réponse. mais le problème semble être de jeter de NSString! à la Chaîne.
merci pour la réponse. Le problème est que le decodeObjectForKey semblent revenir un NSString qui n'est jamais cartable à la Chaîne. Donc le code que vous avez suggéré de ne jamais assigne une valeur à la propriété name.
Jamais entendu parler d'une
NSString
qui ne peuvent pas être exprimées àString
. Essayez d'enregistrer ce quedecodeObjectForKey
renvoie à unAnyObject?
variable, puis d'attribuer àtempName
via abattu, et utiliser le débogueur pour passer à travers les lignes et voir ce qu'il se passe sur l'espoir que, peut vous aider à trouverOriginalL'auteur Antonio
Il y avait deux choses que je devais faire pour le faire fonctionner:
Pour une raison de transition entre la NSString et la Chaîne ne fonctionne pas dans cette situation. ainsi, le casting devrait être fait en deux étapes
affirmer seulement interrompt l'exécution dans les versions debug - c'est la même sémantique que le C de la version. Voir le très cool billet de blog sur la façon dont ils ont construit cette developer.apple.com/swift/blog/?id=4
OriginalL'auteur Arash