探索字典通用属性?

时间:2018-01-24 13:34:21

标签: arrays swift dictionary

// 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语句显示此错误?为什么我不能打印它,这个错误意味着什么?

5 个答案:

答案 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;永远的状态。

当发生这种情况时,只需重新打开游乐场即可。

以下是代码的工作原理:

enter image description here

答案 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。

如果你想将它用作数组,你需要明确地说它是一个数组,你可以这样做:

  1. dict2重新定义为类型:[String:Array<Any>]。这样您就可以简单地使用类型为Array
  2. let are = dict2["arr"]
  3. 或者您需要像let arr = dict2["arr"]! as! Array<Any>那样强制转发,告诉编译器arr类型为Array<Any>
  4. 如果可能的话,我会亲自推荐选项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" });
    }
}