// Example 1
var j = [2,5,"Hello"]
var dict1: [String : Array<Any>] = [:]
dict1 = ["arr" : j ]
print(dict1["arr"]![0])
//Example 2
var k = [2,5,"Hello"]
var dict2: [String : Any] = [:]
dict2 = ["arr" : j ]
let arr = dict2["arr"] as! Array
print(arr[0])
为什么第二个例子中的print语句显示此错误?为什么我不能打印它,这个错误意味着什么?
答案 0 :(得分:1)
您无法转换为Array
,因为Array是泛型类型。您必须转为Array<Any>
或Array<Int>
或[Int]
或[Any]
这有效:
var j = [2,5,7]
var dict1: [String : Array<Any>] = [:]
dict1 = ["arr" : j ]
print(dict1["arr"]![0])
//Example 2
var k = [2,5,7]
var dict2: [String : Any] = [:]
dict2 = ["arr" : j ]
let arr = dict2["arr"] as! Array<Any>
print(arr[0])
虽然我确实知道这只是一个示例代码,但我建议永远不要强制转换为swift,但总是使用可选的转换as?
来避免繁琐的崩溃。也应该总是避免强行打开。
编辑:
有时游乐场无法正常工作:当修复上一个错误时,它仍会将其显示为错误并保持在&#34;正在运行...&#34;永远的状态。
当发生这种情况时,只需重新打开游乐场即可。
以下是代码的工作原理:
答案 1 :(得分:0)
由于dict2
被声明为[String : Any]
,因此dict2["arr"]
的类型默认为Any
。
解决方案01:
将Any
转换为Ints数组(与j
类型匹配):
if let arr = dict2["arr"] as? [Int] {
print(arr[0])
}
解决方案02:
将dict2
声明为[String : [Int]]
而不是[String : Any]
:
var dict2: [String : [Int]] = [:]
因此您的代码应该可行。但是,请记住,为了安全起见,您还应该在从字典访问元素时执行可选绑定,而不是:
print(dict2["arr"]![0])
它应该是:
if let arr = dict2["arr"] {
print(arr[0])
}
意味着如果&#34; arr&#34;不匹配任何值,它不会导致崩溃。
答案 2 :(得分:0)
另一种选择:
//Example 2
var k = [2,5,7]
var dict2: [String : Any] = [:]
dict2 = ["arr" : k ]
if let anyArray = dict2["arr"] as? Array<Any> {
print(anyArray[0])
}
答案 3 :(得分:0)
如果您查看dict2
的定义,则其类型为[String:Any]
,因此dict2["arr"]!
不是数组,而是Any。
如果你想将它用作数组,你需要明确地说它是一个数组,你可以这样做:
dict2
重新定义为类型:[String:Array<Any>]
。这样您就可以简单地使用类型为Array let are = dict2["arr"]
let arr = dict2["arr"]! as! Array<Any>
那样强制转发,告诉编译器arr
类型为Array<Any>
如果可能的话,我会亲自推荐选项1,如果不是,你应该尽量不强制转发,而是使用这样的if let
:
if let arr = dict2["arr"] as? Array<Any> {
print(arr[0])
}
答案 4 :(得分:0)
错误在类型转换中。您没有指定数组项的类型。以下代码按预期工作:
MainPage = new TabbedPage1();
...
public partial class TabbedPage1 : TabbedPage
{
public TabbedPage1 ()
{
InitializeComponent();
this.Children.Add(new ContentPage() { Icon = "icon.png", Title = "First Tab" });
this.Children.Add(new ContentPage() { Icon = "icon.png", Title = "Second Tab" });
this.Children.Add(new ContentPage() { Icon = "icon.png", Title = "Third Tab" });
}
}