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数组中的访问结构的主要内容,如果未能解决你的问题,请参考以下文章