2015 年冬季/第 10 讲 - 损坏的 Twitter 包

Winter 2015 / Lecture 10 - Broken Twitter Package

在观看第 10 课 iTunes 视频的同时尝试跟进并编写 Smashtag 项目。

当我将下载的 Twitter 包添加到我的 Smashtag 项目时,当我在 TweetTableViewController 中引用它时 XCode 找不到推文 class。

由于上述问题,我把属于Twitter包的4个class单独添加到项目中。 XCode 找到了四个 classes 但以这种方式添加它们会产生 11 个编译错误。

我正在使用 XCode 版本 6.3 (6D570),它是 iOS 8.3 版本的后续版本。

有没有其他人遇到过这个问题?

感谢您阅读我的问题。 ~李

我刚刚 session 修复了同一版本 Xcode 的 Twitter 包文件。

似乎坏掉的是,在这个版本的Swift中,常量('let x...')只能被初始化一次,所以如果一个常量在声明中被赋值('let x = false'), 它可能不会在 init() 函数中更改。 Twitter 包给了一些常量初始值,但随后更改了 init() 函数中的值。

我的解决方案是遵循当前版本的 Apple Swift 语言书籍中建议的样式:将(许多)常量声明为隐式展开的可选值,无条件地为它们赋值init() 函数(其值可能为 nil),然后测试它们中的任何一个是否为 nil,如果是,则来自 init() 的 return nil。

查看 https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html,单击 "On This Page" 并选择 "Failable Initializers"

此外,在 TwitterRequest.swift 中,我需要在对 performTwitterRequest(request, handler: handler) 的几次调用中添加参数名称 'handler:'。

作为常量初始化的例子,在MediaItem.swift:

<<原代码>>

...
    public let aspectRatio: Double = 0
...
    init?(data: NSDictionary?) {
        var valid = false
        if let urlString = data?.valueForKeyPath(TwitterKey.MediaURL) as? NSString {
            if let url = NSURL(string: urlString) {
                self.url = url
                let h = data?.valueForKeyPath(TwitterKey.Height) as? NSNumber
                let w = data?.valueForKeyPath(TwitterKey.Width) as? NSNumber
                if h != nil && w != nil && h?.doubleValue != 0 {
                    aspectRatio = w!.doubleValue / h!.doubleValue
                    valid = true
                }
            }
        }
        if !valid {
            return nil
        }
    }
...

<<更新代码>>

...
    public let aspectRatio: Double
...
    init?(data: NSDictionary?) {
        if let urlString = data?.valueForKeyPath(TwitterKey.MediaURL) as? NSString {
            if let url = NSURL(string: urlString as String) {
                self.url = url
                let h = data?.valueForKeyPath(TwitterKey.Height) as? NSNumber
                let w = data?.valueForKeyPath(TwitterKey.Width) as? NSNumber
                if h != nil && w != nil && h?.doubleValue != 0 {
                    aspectRatio = w!.doubleValue / h!.doubleValue
                    return
                }
            }
        }
        return nil
    }
...

可能不是执行此操作的最正确(阅读:最佳实践)方法,但我将把它归结为完成课程所需的一切。

我刚刚浏览了编译错误列表并将相关属性更改为 var 而不是 letConstants 无法更改,在新版本的 Swift 中它们只能被实例化一次。所以为了不重写太多的代码,我选择让某些属性vars 而不是lets.

我在 iTunes U 课程后发现的其他错误:

  • 命名的“handler:”参数需要在几个地方显式指定名称。
  • 模拟器将显示“TwitterRequest:无法发现 Twitter 帐户类型。”直到你进入设置(在模拟器内)并设置 Twitter 帐户。此时我不得不重启设备,因为调用是在 ViewDidLoad 中进行的,因此仅在第一次加载视图时调用。(或者,您可以从模拟器中的应用程序切换器关闭该应用程序,然后以这种方式重新启动。)

这是一个带有更正代码的要点,您可以将其用作 Twitter 包,它将与课程一起使用并修复了上述错误,减去 Twitter 帐户设置:

https://gist.github.com/mattpetters/ccf87678ccce0c354398

正如 Christian R. Jimenez 所说,"I went to Settings in the Simulated iphone and add my Twitter Account. And everything works perfect." 在 http://cs193p.m2m.at/cs193p-lecture-10-table-view-winter-2015/ 中。我刚刚添加了我的 Twitter 帐户并进行了测试,它有效!

我在使用 Swift 2.0 和 Xcode 7.2

的 Twitter 软件包时遇到了类似的问题

我是 Swift 的新手,所以我所做的更改很可能不是最佳实践,但更新后的文件确实 有效https://gist.github.com/awaxman11/9c48c0b4c622bffb879f.

在大多数情况下,我使用了 Xcode 的建议更改。我所做的两个较大的更改是:

  1. 在 Tweet.swift 中,我更新了 IndexedKeyword 结构的初始化方法以使用 advanceBy() 而不是 advance()
  2. 在 TwitterRequest.swift 中,我更新了 NSJSONSerialization 的签名以符合新的错误处理系统