Swift中的NSIndexPath

时间:2015-07-05 11:45:37

标签: arrays swift nsindexpath

我希望,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")

2 个答案:

答案 0 :(得分:35)

  

我不了解NSIndexPath的工作原理。

对于iOS,如果您正在使用{{},那么您可以将NSIndexPath视为包含两个Int属性sectionrow的只读结构{1}}或UITableViewsection如果您正在使用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) 常量Inta,并将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 进行转换,在IndexPathNSIndexPath之间进行转换:

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
}