Swift中的NSIndexPath

Ant*_*ija 8 arrays nsindexpath swift

我知道,希望类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.
    }


}
Run Code Online (Sandbox Code Playgroud)

我不明白NSIndexPath是如何工作的.我已经阅读了文档,但是在我学习这一点的过程中,我仍然很难理解.我如何知道NSIndexPath具有行的属性?罐头有人解释这一行的每一部分请:

let (courseTitle, courseAuthor) = devCourses[indexPath.row]
Run Code Online (Sandbox Code Playgroud)

NSIndexPath如何知道此常量中的courseTitle引用索引号0 whitin数组索引0 ("iOS App Dev with Swift Essential Training","Simon Allardice")

vac*_*ama 36

我不明白NSIndexPath是如何工作的.

在iOS设备上,你能想到的NSIndexPath是,它包含两个只读结构Int特性sectionrow,如果你正在使用的UITableViewS或section并且item如果你正在使用UICollectionView秒.

您可以使用NSIndexPath:forRow:inSection:工厂方法创建它们:

let indexPath = NSIndexPath(forRow: 1, inSection: 0)
Run Code Online (Sandbox Code Playgroud)

并通过访问他们的属性阅读它们:

print("row is \(indexPath.row)")
Run Code Online (Sandbox Code Playgroud)

我如何知道NSIndexPath具有行的属性?

Xcode有一些很好的功能可以帮助您理解您正在查看的代码.在Xcode中,Option单击row上面的语句行,它会告诉你它是什么.在弹出窗口中,如果单击Reference旁边的NSIndexPath UIKit Additions,它将显示文档.

有人可以解释一下这一行的每一部分:

let (courseTitle, courseAuthor) = devCourses[indexPath.row]
Run Code Online (Sandbox Code Playgroud)

devCourses是包含两个类型值的元组数组String.您可以通过option单击devCourses并显示它来查看此内容[(String, String)].如果它是一个数组的阵列,String它会说[[String]][Array<String>](这是两种说法相同的方式).

indexPath.row只是Int指示所选行tableView.

devCourses[indexPath.row]然后是该指数的元组.例如,如果row0,那么元组就是("iOS App Dev with Swift Essential Training","Simon Allardice").

最后,您可以通过将它们声明为元组并使用元组初始化它们来同时初始化两个变量.例如:

let (a, b) = (3, 4)
Run Code Online (Sandbox Code Playgroud)

创建两个Int常量ab并分配3a4b.

所以这个语句是从整数指示的数组中检索元组indexPath.row并创建两个变量,为第一个变量courseTitle赋值元组中第一个值的值,并为第二个变量赋值元组中第二courseAuthor个值的值.


Swift 3的更新

NSIndexPath仍然存在于Foundation中,但是当在Swift 3中使用indexPaths时,IndexPath现在使用了一种新类型.这种类型是一种结构.

您仍然可以NSIndexPath使用以下更新的语法在Swift 3中创建,但您无法更改属性:

var ip = NSIndexPath(row: 0, section: 0)

ip.row = 5    // Cannot assign to property: 'row' is a get-only property
Run Code Online (Sandbox Code Playgroud)

但你应该使用新的IndexPath结构.

IndexPath 使用类似的语法创建:

var ip2 = IndexPath(row: 0, section: 0)

ip2.row = 5   // this works
Run Code Online (Sandbox Code Playgroud)

您可以相互转换IndexPath,并NSIndexPath通过与铸造as:

let ip = NSIndexPath(row: 0, section: 0)
let ip2 = ip as IndexPath     // convert to IndexPath
let ip3 = ip2 as NSIndexPath  // convert back to NSIndexPath
Run Code Online (Sandbox Code Playgroud)

所有使用indexPaths 的CocoaCocoa Touch API都已转换为IndexPath在Swift中使用.

  • swift3:`let indexPath = IndexPath(row:someRow,section:someSection)` (3认同)

vad*_*ian 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)"}
}
Run Code Online (Sandbox Code Playgroud)

所述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) }
Run Code Online (Sandbox Code Playgroud)

应用属性的行看起来更清晰

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
}
Run Code Online (Sandbox Code Playgroud)