我已经使用Swift创建了一个iOS应用程序,一切都在模拟器上工作正常和花花公子。我没有任何错误或崩溃,但是当我提交我的应用程序以便放在应用程序商店时,Apple会拒绝它并让我知道当用户做出选择时它会崩溃。我无法重新创建此错误/崩溃。我拿了崩溃日志并象征着他们。这行代码成了崩溃的罪魁祸首:
linksToPass = getLinks(season) as [String:[String]]
这一行试图从我创建的getLinks()函数中存储生成的Dictionary。它肯定会得到一个字典,如果没有要发回的字典,我会创建一个包含错误信息的字典,因此无论如何都可以确保以该格式返回字典。看到我无法重新创建崩溃,我只是试图以任何可能的方式错误地检查这行代码,以便在我重新提交给Apple时不会崩溃。
我尝试检查结果字典是否为零:
if(getLinks(seasons) != nil){
linksToPass = getLinks(season) as [String:[String]]
}
这是无效的,而且XCode让我知道UInt8与NSDictionary不兼容或具有这种性质。
然后我修复了那条线并将其更改为:
if(getLinks(seasons) != ["":[""]]){
linksToPass = getLinks(season) as [String:[String]]
}
我只是不确定这是否是检查错误的好方法。我想知道是否有任何关于如何确保此线路不会失败并导致崩溃的建议。非常感谢你。
编辑: 这是我的getLinks()函数,如果这有助于为问题添加更多信息:
var season = ""
let hymn_links = Hymn_Links()
func getLinks (nameofseason:String) -> NSDictionary
{
switch (nameofseason)
{
default:
return ["Maps Not Found": []]
}
}
编辑#2:
这是我使用选项更新的getLinks()函数。
func getLinks (nameofseason:String) -> NSDictionary?
{
switch (nameofseason)
{
default:
return nil
}
}
同样在我的linksToPass声明中,我将其更改为:
if let links = getLinks(season) as? [String:[String]]
{
linksToPass = links
hymnnames = [String] (linksToPass.keys)
}
答案 0 :(得分:2)
Swift优化器存在一些已知问题。有些人已经使用调试版本进行发货。
我的建议是使用优化版本进行测试,看看是否可以重现它。然后,您可以尝试将调试版本发送到App Store。
一般代码评论
为什么要返回NSDictionary而不是Swift字典呢?在不知道你的hymn_links对象的内容和创建方法的情况下,我无法确定它有多好。
我会避免as
强制转换直到Swift 1.2并坚持使用as?
然后处理nil情况。至少在你的"编辑2"如果nil无法转换为[String:[String]]
,则会导致崩溃,尽管[String:[String]]?
应该是可能的。
答案 1 :(得分:1)
你能保证switch语句返回的所有项目在任何情况下永远不会为零吗?如果不是getLinks
则应返回Optional。
请注意,getLinks
几乎不可能知道其中一个项目永远不会是零,而在Swift中,未经手工处理的nils是等待发生的崩溃。除非所有这些方法正确处理nil。
返回一个Optional并在调用getLinks
的语句中处理它。
语言以不同方式处理nils,Objective-C通过崩溃处理它们,Java和Swift。但Swift有一种机制来处理nils而不会崩溃:Optionals,使用它。