2015年冬季/第10讲 - Twitter包装破损

时间:2015-04-18 14:55:03

标签: cs193p

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

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

由于上述问题,我将属于Twitter软件包的四个类分别添加到项目中。 XCode找到了这四个类,但以这种方式添加它们会产生11个编译错误。

我正在使用iOS 8.3版本之后的XCode版本6.3(6D570)。

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

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

4 个答案:

答案 0 :(得分:9)

这可能不是最正确的(阅读:最佳实践)方法,但是我会用它来完成课程的完成。

我刚刚查看了编译错误列表,并将相关属性更改为var而不是letConstants无法更改,Swift新版本只能实例化一次。因此,为了不重写太多代码,我选择创建某些属性var而不是let s。

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

  • 命名的'handler:'参数在几个地方需要明确名称。
  • 模拟器将显示" TwitterRequest:无法发现Twitter帐户类型。“直到您转到设置(在模拟器内)并设置Twitter帐户。此时我必须重新启动设备,因为调用是在ViewDidLoad中进行的,因此仅在视图第一次加载时调用。 (或者,您可以在模拟器中关闭应用程序切换器中的应用程序并重新启动。)

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

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

答案 1 :(得分:3)

正如Christian R. Jimenez所说,“我去了模拟iphone中的设置,并添加了我的Twitter帐户。一切都很完美。”在http://cs193p.m2m.at/cs193p-lecture-10-table-view-winter-2015/。我刚刚添加了我的Twitter帐户并进行了测试,它确实有效!

答案 2 :(得分:2)

我在使用Swift 2.0和Xcode 7.2的Twitter软件包时遇到了类似的问题

我对Swift很新,所以我所做的更改很可能不是最佳做法,但更新的文件工作https://gist.github.com/awaxman11/9c48c0b4c622bffb879f

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

  1. 在Tweet.swift中,我更新了IndexedKeyword struct的init方法,以使用advanceBy()代替advance()
  2. 在TwitterRequest.swift中,我更新了NSJSONSerialization的签名以符合新的错误处理系统

答案 3 :(得分:0)

我刚刚为同一版本的Xcode安装了Twitter软件包文件。

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

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

请参阅https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html,点击"本页"并选择" Failable Initializers"

另外,在TwitterRequest.swift中,我需要添加参数名称' handler:'在几次调用performTwitterRequest(request,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
    }
...