我希望,NSIndexPath类可以处理包含数组的数组。
我有这段代码:
import UIKit
class ViewController: UIViewController, UITableViewDataSource {
let devCourses = [
("iOS App Dev with Swift Essential Training","Simon Allardice"),
("iOS 8 SDK New Features","Lee Brimelow"),
("Data Visualization with D3.js","Ray Villalobos"),
("Swift Essential Training","Simon Allardice"),
("Up and Running with AngularJS","Ray Villalobos"),
("MySQL Essential Training","Bill Weinman"),
("Building Adaptive Android Apps with Fragments","David Gassner"),
("Advanced Unity 3D Game Programming","Michael House"),
("Up and Running with Ubuntu Desktop Linux","Scott Simpson"),
("Up and Running with C","Dan Gookin") ]
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return devCourses.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = UITableViewCell()
let (courseTitle, courseAuthor) = devCourses[indexPath.row]
cell.textLabel?.text = courseTitle
return cell
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我不了解NSIndexPath的工作原理。我已经阅读了文档,但是在我学习这一点的过程中,我仍然难以理解。我如何知道NSIndexPath具有行的属性?罐头有人解释这一行的每一部分,请:
let (courseTitle, courseAuthor) = devCourses[indexPath.row]
NSIndexPath如何知道此常量中的courseTitle引用索引号0 whitin数组索引0 ("iOS App Dev with Swift Essential Training","Simon Allardice")
答案 0 :(得分:35)
我不了解NSIndexPath的工作原理。
对于iOS,如果您正在使用{{},那么您可以将NSIndexPath
视为包含两个Int
属性section
和row
的只读结构{1}}或UITableView
和section
如果您正在使用item
s。
使用UICollectionView
工厂方法创建它们:
NSIndexPath:forRow:inSection:
并通过访问其属性来阅读它们:
let indexPath = NSIndexPath(forRow: 1, inSection: 0)
我怎么知道NSIndexPath具有行的属性?
Xcode有一些很好的功能可以帮助您理解您正在查看的代码。在Xcode中, Option - 点击上面语句行中的print("row is \(indexPath.row)")
,它会告诉你它是什么。在弹出窗口中,如果单击参考旁边的 NSIndexPath UIKit Additions ,它将显示文档。
请有人解释这一行的每一部分:
row
let (courseTitle, courseAuthor) = devCourses[indexPath.row]
是一个元组数组,包含两个类型为devCourses
的值。您可以通过选项 - 点击String
来查看此内容,并显示devCourses
。如果它是[(String, String)]
数组的数组,它会说String
或[[String]]
(这是两种说法相同的方式)。
[Array<String>]
只是indexPath.row
,表示Int
的所选行。
tableView
然后是该索引的元组。例如,如果devCourses[indexPath.row]
为row
,那么元组将为0
。
最后,您可以通过将它们声明为元组并使用元组初始化它们来同时初始化两个变量。例如:
("iOS App Dev with Swift Essential Training","Simon Allardice")
创建两个let (a, b) = (3, 4)
常量Int
和a
,并将b
分配给3
,将a
分配给4
。
所以这个语句从整数b
指示的数组中检索元组并创建两个变量,为元组中的第一个值赋值第一个变量indexPath.row
并赋值第二个变量courseTitle
元组中第二个值的值。
Swift 3的更新
courseAuthor
仍存在于 Foundation 中,但在使用 Swift 3 中的indexPaths时,现在会使用新类型NSIndexPath
。此类型是结构。
您仍然可以使用以下更新语法在Swift 3中创建IndexPath
,但无法更改属性:
NSIndexPath
但您应该使用新的var ip = NSIndexPath(row: 0, section: 0)
ip.row = 5 // Cannot assign to property: 'row' is a get-only property
结构。
IndexPath
:
IndexPath
您可以使用var ip2 = IndexPath(row: 0, section: 0)
ip2.row = 5 // this works
进行转换,在IndexPath
和NSIndexPath
之间进行转换:
as
使用indexPaths的所有 Cocoa 和 Cocoa Touch API已转换为在Swift中使用let ip = NSIndexPath(row: 0, section: 0)
let ip2 = ip as IndexPath // convert to IndexPath
let ip3 = ip2 as NSIndexPath // convert back to NSIndexPath
。
答案 1 :(得分:6)
稍微偏离主题,但我想鼓励每个人使用模型的自定义类而不是“原始”类型。有一点努力,但有很大的好处。
具有两个属性和描述的简单类(调试时描述变量很有用)
class DevCourse : Printable {
var author : String
var title : String
init(author : String, title : String) {
self.author = author
self.title = title
}
var description : String { return "DevCourse \(title) by \(author)"}
}
可以轻松映射devCourses
数组,以便用一行创建DevCourse
个实例
let rawDevCourses = [
("iOS App Dev with Swift Essential Training","Simon Allardice"),
("iOS 8 SDK New Features","Lee Brimelow"),
("Data Visualization with D3.js","Ray Villalobos"),
("Swift Essential Training","Simon Allardice"),
("Up and Running with AngularJS","Ray Villalobos"),
("MySQL Essential Training","Bill Weinman"),
("Building Adaptive Android Apps with Fragments","David Gassner"),
("Advanced Unity 3D Game Programming","Michael House"),
("Up and Running with Ubuntu Desktop Linux","Scott Simpson"),
("Up and Running with C","Dan Gookin") ]
let devCourses = rawDevCourses.map { DevCourse(author: $0.1, title: $0.0) }
应用属性的行看起来更清晰
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("MyIdentifier", forIndexPath: indexPath) as! UITableViewCell
let course = devCourses[indexPath.row]
cell.textLabel?.text = course.title
return cell
}