import UIKit
import Ji
class ViewController: UIViewController {
@IBOutlet weak var mistarTitle: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let mistar = Ji(htmlURL: URL(string: "https://mistar.oakland.k12.mi.us/novi/studentportal/")!)
let titleNode = mistar?.xPath("//head/title")?.first
print("title: \(titleNode!.content)")
mistarTitle.text = titleNode!.value
// Finding ID Node
let bodyDivNode = mistar?.xPath("//body/div/div")?.first
let idNodeNext = bodyDivNode?.nextSibling?.xPath("//div/form/div/div").first
let next = idNodeNext?.nextSibling?.xPath("//table").dropFirst().first
let nextTr = idNodeNext?.xPath("//tr").dropFirst().first
let firstID = nextTr?.nextSibling?.xPath("td").dropFirst().first
let inputID = firstID?.xPath("input").first
print(inputID?.attributes)
// Finding PassWord Node
let firstPass = next?.children.dropFirst().dropFirst().first
let firstP = firstPass?.xPath("td").dropFirst().first
let inputPW = firstP?.xPath("input").first
print(inputPW?.attributes)
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
和function(x: Tarray<String>)
之间有什么区别,尤其是每种变体的缺点和优势是什么?
答案 0 :(得分:9)
首先是动态数组参数,第二个是open array参数。
打开数组参数通常会给你带来好处,只需传递方括号中的值,如下所示:
foobar([x, y, z]);
从XE7开始,你也可以用更多的开销来初始化动态数组。最后,它取决于您对值的处理方式。如果你没有存储它们,那么开放数组参数通常就足够了。但是,如果要将值存储在数组中,则不能将其分配给任何动态数组参数,而必须复制值。
虽然动态数组和开放数组参数的语法相同(array of X
),但它们在两个方向上都不兼容(您只能将动态数组传递给开放数组参数但不能指定打开动态数组变量的数组参数。
如果您在要通过RTTI调用的方法上使用开放数组参数,则应该考虑一件事 - 由于RTTI无法正确处理它们,因此无效 - 请参阅RSP-16317。
此外TArray<X>
应优先于某些显式声明的数组类型,例如TXArray = array of X
,因为TAnotherXArray = array of X
与TXArray
但TArray<T>
或别名不兼容TXArray = TArray<T>
始终是类型兼容的。
有关更多信息,请参阅Rudy的优秀article about open array parameters。