J'essaye de charger un fichier de mon ensemble d'applications dans Swift 3, et je suis tombé sur une situation étrange avec l'inférence de type Swift. Si j'utilise le code suivant, j'obtiens une erreur sur la troisième ligne qui indique Value of optional type "String?" not unwrapped
.Swift Impossible Type Inférence
let url = NSURL(fileURLWithPath:Bundle.main.bundlePath)
let url2 = url.appendingPathComponent("foo.txt")
let path:String = url2?.path
Pour corriger l'erreur que je déballe la valeur sur la troisième ligne en changeant à:
let path:String = url2?.path!
Je reçois maintenant l'erreur Cannot force unwrap value of a non-optional type 'String'
. Il semble que Swift ne puisse pas déterminer si la propriété path est String
ou String?
. La fonctionnalité de saisie semi-automatique dans Xcode indique qu'il s'agit d'un String
, mais les documents indiquent qu'il s'agit d'un String?
.
La correction suggérée par Xcode pour la première erreur était de remplacer url2?.path
par (url2?.path)!
, qui a finalement fini par fonctionner, mais je ne sais pas pourquoi cela fonctionne et les autres ne le font pas.
let path:String = (url2?.path)!
Que se passe-t-il? Est-ce un bug d'inférence de type à Swift, ou suis-je manque quelque chose de super évident
'laisser fooBundleURL = Bundle.main.bundleURL.appendingPathComponent ("foo.txt")' ' –
let fooPath = fooBundleURL.path' –
@LeoDabus Je suis d'accord que fonctionne, mais ma question est pourquoi le code fourni ne fonctionne pas. – Aderis