Swift数组中的访问结构

Posted

技术标签:

【中文标题】Swift数组中的访问结构【英文标题】:Access structure in Swift array 【发布时间】:2015-09-27 16:18:16 【问题描述】:

我可以从 ViewController 访问应用程序委托中定义的数组内部的结构吗?

我得到错误: 'Any' 在 XCode 6.2 中没有名为 'title' 的成员

访问数组内部结构的语法是什么?

//AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 

var window: UIWindow?

struct TodoItem 
    var title: String


var todoItem = TodoItem(
    title: "Get Milk")

var myArray: [Any] = []

然后在 ViewController 中

//
//  ViewController.swift


import UIKit

class ViewController: UIViewController 

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let delegate = UIApplication.sharedApplication().delegate as AppDelegate

    //here I'm adding the struct to the array
    let myTodoItem = delegate.myArray.append(delegate.todoItem)

    //how do I access the items in the struct?
    println(delegate.myArray[0].title)

【问题讨论】:

【参考方案1】:

您可以像访问类一样访问数组中的结构。

您的问题是您明确告知该数组包含Any 对象。键入MyStruct 类型的数组,它工作正常:

var myArray: [MyStructure] = [];

或者,如果您不能修改数组声明,请强制转换:

myValueIWannaRead = (myArray[0] as MyStruct).myValueIWannaRead

【讨论】:

【参考方案2】:

您可以定义数组来存储您想要的类型:

var myArray: [TodoItem] = [];

这样就可以正常访问实例了。

Any 类型表示未知类型(类/原始类型)的对象,并且在编译期间无法知道访问的实例将属于哪种类型。

【讨论】:

【参考方案3】:

在 Swift 中总是尽可能具体。

如果数组只包含TodoItem类型的项目,分别声明。

var myArray: [TodoItem] = []

Any是一种占位符,编译器不知道它是什么动态类型。

【讨论】:

【参考方案4】:

为什么必须将struct TodoItem 添加到 AppDelegate?在我看来,最好在你拥有视图控制器的同一个文件中创建它,或者 - 更好的是 - 创建一个名为 TodoItem.swift 的新 Swift 文件来保存结构。

然后,在您将结构移动到新文件或 View Controller 文件内,但在 ViewController 类之外。你可以打电话:

let myTodoItem = TodoItem(title: "Get Milk") // declaring TodoItem
var myTodoItemArray : [TodoItem] = [] // declaring TodoItem array
myTodoItemArray.append(myTodoItem) // Appending to the array

// then you can set it by calling the array only member
let todoItem = myTodoItemArray[0] as! TodoItem
let title = todoItem.title

// Or you can just call the toDo Item itself
let title = myTodoItem.title

如果您想在两个不同的类之间传递这些数据,我建议通过创建协议来使用 Delegation,或者使用带有 NSNotifications 的 Notifications

我希望这会有所帮助,祝您编码愉快。

编辑:修复了代码中的一些小错误

【讨论】:

【参考方案5】:

解决方案1:您的结构是在 AppDelegate 类下定义的,因此您必须像这样解析它;

    //** Swift 1.2, xCode 6.3.1**//
    let delegate = UIApplication.sharedApplication().delegate as! AppDelegate

    //here I'm adding the struct to the array
    delegate.myArray.append(delegate.todoItem)

    //how do I access the items in the struct?
    println((delegate.myArray[0] as! AppDelegate.TodoItem).title)

解决方案2:将数组 Any 的数据类型更改为 TodoItem

var myArray: [TodoItem] = []

然后,它会工作;

    let delegate = UIApplication.sharedApplication().delegate as! AppDelegate

    //here I'm adding the struct to the array
    delegate.myArray.append(delegate.todoItem)

    //how do I access the items in the struct?
    println(delegate.myArray[0].title)

【讨论】:

以上是关于Swift数组中的访问结构的主要内容,如果未能解决你的问题,请参考以下文章

Swift 如何访问 Struct 对象字典中的特定变量

如何使用 Swift 动态访问数组中的项目

将字典映射到 Swift 中的结构数组

Swift 3 - 通过数组索引访问项目键值

访问字典数组 Swift 3

Swift 3 中的 UIPickerView 和子类数组