设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

Swift中的泛型使用

2014-10-16 11:43| 发布者: joejoe0332| 查看: 3865| 评论: 0|原作者: 洪丹阳1991, 凤阳马超, Boobs, jluflyingz, LeoXu, 痞子蔡|来自: oschina

摘要: 恭喜你,你可真棒!在不到半个时间里,你已经通过宣传IOS 8盛宴成功解锁了第一个Swift教程!它是Swift系列教程的一个缩水版,就先给你偷看一眼了好了,希望你能够喜欢! ...


在项目中测试

  让我们在实际项目中,实验编译推断使用的下标函数,以及一般情况下,OrderedDictionary是怎么工作的。


  通过点击"文件"、"创建"、"文件",新建一个项目,依次选择"IOS"、"Source"、"Playground",再点击下一步。然后点击创建。


  你必须得这样操作:复制和粘贴OrderedDictionary.swift整体到新建的项目中。因为不能在写教程时你的应用模型中”看见”代码


  注意:这有一个解决方法,可以取代复制、粘贴的方式。如果你需要将你应用的代码加入到一个框架中,你的项目将接受的你代码,就像Corrine Krych指出的这


  现在,在你的项目底部加入下列的代码:

1
2
3
var dict = OrderedDictionary<Int, String>()dict.insert("dog", forKey: 1, atIndex: 0)dict.insert("cat", forKey: 2, atIndex: 1)println(dict.array.description 
        " : " 
        + dict.dictionary.description) var byIndex: (Int, String) = dict[0]println(byIndex) var byKey: String? = dict[2]println(byKey)


  在侧栏中(或者通过视图/助理编辑/显示助理编辑/),你将可以看到println()函数输出的内容:


  在这个例子中,字典有一个整数型的key,所以编译器会审查被使用分配决定使用哪个下标变量的类型。如果被使用的下标是一个(Int, String)的byIndex,编译器会匹配期望的返回值类型,使用数组类型的索引的下标。


  如果你想从一个 byIndex 或者 byKey的变量中,移除类型的定义。编译器将会报错,表明编译器不知道使用哪一个下标。


  小贴士:由于编译器是按照类型推理来工作的,所以需要明确地表示出类型。当存在多个有相同的争议的返回值类型的函数时,调用者需要具体化。需要注意:Swift中函数,可以“建-破”改变。


  通过在项目中,对有顺序的字典的实验中,你可以发现他的工作原理。在重返app之前,尝试从中添加、移除、以及改变key和value的类型。现在,你可以在你的顺序字典中读、写操作!但要小心你的数据结构。现在你可以通过app来感受其中的乐趣了!

  

添加图片查找

  现在是时候让你回过头来注意手中的app了。打开 MasterViewController.swift。在两个@IBOutlets 的下面,添加下列变量的定义:

1
var searches = OrderedDictionary<String, [Flickr.Photo]>()


  你或许在困惑,为什么Flickr.Photo的类型中有个句号。那是因为Photo是在Flickr类的内部定义的类。在Swift中,这样的层次结构是非常有利的。它将有助于类的名称简短化。在Flickr的内部,你可以单独使用Photo类,因为上下文关系告诉了编译器这是什么。这是顺序化字典查询用户订阅的Flickr的功能。真像你看到的,包含查询的字符串,和Flickr.Photo数组,或是从Flickr API 中返回的照片。注意,你在尖括号里给出的key和value,将成为在具体实现中KeyType和ValueType的参数类型。


  接下来,找到表格视图数据源的tableView(_:numberOfRowsInSection:)方法,然后把它改为如下所示:

1
2
3
func tableView(tableView: UITableView, 
               numberOfRowsInSection section: Int) -> Int{
  return self.searches.count}


  这个方法使用有序字典来告诉表格视图有多少行。接着,找到表格视图数据源的tableView(_:cellForRowAtIndexPath:)方法并把它改为如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
func tableView(tableView: UITableView, 
               cellForRowAtIndexPath indexPath: NSIndexPath)
              -> UITableViewCell{
  // 1
  let cell = 
    tableView.dequeueReusableCellWithIdentifier("Cell"
      forIndexPath: indexPath) as UITableViewCell   // 2
  let (term, photos) = self.searches[indexPath.row]   // 3
  if let textLabel = cell.textLabel {
    textLabel.text = "\(term) (\(photos.count))"
  }
  return cell}


  这是你在这个方法中所做的:

1. 首先,从UITableView中挪出一个单元格。你需要把它直接转换为UITableViewCell,因为dequeueReusableCellWithIdentifier仍旧返回AnyObject(id in Objective-C),而不是UITableViewCell。或许在将来,苹果公司会利用泛型重写这部分API。

2. 接着,用你给的下标索引从指定的行获取Key和Value,

3. 最后,适当地设置单元格的文本标签并且返回当前单元格。


  现在让我们尝尝鲜。找到UISearchBarDelegate 的拓展,就像下列的代码一样,改变单例方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func searchBarSearchButtonClicked(searchBar: UISearchBar!) {
  // 1
  searchBar.resignFirstResponder()   // 2
  let searchTerm = searchBar.text
  Flickr.search(searchTerm) {
    switch ($0) {
    case .Error:
      // 3
      break    case .Results(let results):
      // 4
      self.searches.insert(results, 
                           forKey: searchTerm, 
                           atIndex: 0)       // 5
      self.tableView.reloadData()
    }
  }}

当用户点击查询按钮时,这个方法将会被调用。下列就是在这个方法中,你正做的事:

1.你第一反应是放弃使用查询框以及键盘。

2.然后,你又会使用搜索框查询你输入的文字,为查询的文字而使用Flickr类来寻找。Flickr的查询方法是:查询术语,关闭执行查询成功或者失败。通过参数关闭:要不是错误,那就是结果。

3.在错误的情况下,不会发生任何事。但是你可以通过使用警报来提示错误,但是现在我们可以简化这样的操作。代码需要在这时暂停会儿,告诉Swfit编译器你的错误没有任何反应的动机。

4.如果查询有效,将会在查询结果中显示相关的值。你将查询的术语作为key加入到顺序字典中。如果已经在字典中存在了,将会把他放入到list的顶部,然后用最后的结果更新整个字典。

5.最终,由于你有新的数据,将再次加载table view。

哇!你的app将可以用于查询图片了!


构建并运行app,做几次查询。你将会看到下面这样的一些东西:

现在再用与之前搜索词不同的另外一个进行查询. 你将会看到它跳到了顶部:

  选择一个查询结果点击去,你会发现它并没有显示照片。现在是时候修复这个问题了!



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部