Зима 2015 г. / Лекция 10 - Сломанный пакет Twitter

Пытаюсь следовать и кодировать проект Smashtag во время просмотра видео лекции 10 в iTunes.

Когда я добавляю загруженный пакет Twitter в свой проект Smashtag, XCode не может найти класс Tweet, когда я ссылаюсь на него в TweetTableViewController.

Из-за проблемы, описанной выше, я добавил в проект четыре класса, принадлежащих пакету Twitter, по отдельности. XCode нашел четыре класса, но добавление их таким образом вызвало 11 ошибок компиляции.

Я использую XCode версии 6.3 (6D570), которая следует за выпуском iOS 8.3.

Кто-нибудь еще сталкивался с этой проблемой?

Спасибо, что прочитали мой вопрос. ~ Ли


person Lee Trent    schedule 18.04.2015    source источник


Ответы (4)


Возможно, это не самый правильный (читай: лучшая практика) способ сделать это, но я собираюсь списать его на выполнение того, что нужно для завершения курса.

Я просто просмотрел список ошибок компиляции и изменил соответствующие свойства на var вместо let. Constants нельзя изменить, а в новой версии Swift их можно создать только один раз. Поэтому, чтобы не переписывать слишком много кода, я решил сделать некоторые свойства vars вместо lets.

Другие ошибки, которые я обнаружил после прохождения курса iTunes U:

  • Именованный аргумент «handler:» требует явного имени в нескольких местах.
  • Симулятор покажет «TwitterRequest: не удалось обнаружить тип учетной записи Twitter». пока вы не зайдете в «Настройки» (внутри симулятора) и не настроите учетную запись Twitter. В этот момент мне пришлось перезагрузить устройство, так как вызов выполняется в ViewDidLoad и, таким образом, вызывается только при первой загрузке представления.(В качестве альтернативы, вы можете закрыть приложение из переключателя приложений в симуляторе и перезапустить таким образом.)

Вот суть с исправленным кодом, который вы можете использовать в качестве пакета Twitter, который будет работать с курсом и содержит исправления для вышеупомянутых ошибок, за вычетом настроек учетной записи Twitter:

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

person mpetts    schedule 21.04.2015
comment
mpetts, я не могу отблагодарить вас за то, что вы поделились своим кодом. Благодаря вашей щедрости я смог дочитать десятую лекцию до конца. Все работало! - person Lee Trent; 24.04.2015
comment
Я и другие, проходящие зимнюю версию 2015 года этого курса iTunes, в долгу перед вами! - person Lee Trent; 24.04.2015
comment
Не проблема! Пришлось пройти через это самому и столкнулся с той же дилеммой. Удачи в учебе! - person mpetts; 30.04.2015
comment
Спасибо за подсказку с настройкой учетной записи Twitter в приложении «Настройки». Теперь я получаю сообщение об ошибке: TwitterRequest: нет ответа от Twitter. Это ошибка доступа, в плисте пришлось выставить NSAppTransportSecurity и разрешить twitter.com а картинки идут с другого ресурса, нужно разблокировать отдельно. - person Michael K.; 31.07.2015

Как сказал Кристиан Р. Хименес: «Я зашел в «Настройки» в смоделированном iphone и добавил свою учетную запись Twitter. И все работает отлично». в http://cs193p.m2m.at/cs193p-lecture-10-table-view-winter-2015/. Я только что добавил свою учетную запись Twitter и проверил ее, она работает!

person Zhaolong Zhong    schedule 13.05.2015

У меня были аналогичные проблемы с пакетами Twitter с использованием Swift 2.0 и Xcode 7.2.

Я новичок в Swift, поэтому есть большая вероятность, что внесенные мной изменения не являются лучшими практиками, но обновленные файлы работают: https://gist.github.com/awaxman11/9c48c0b4c622bffb879f.

По большей части я использовал предложенные Xcode изменения. Два больших изменения, которые я сделал, были:

  1. В Tweet.swift я обновил метод инициализации структуры IndexedKeyword, чтобы использовать advanceBy() вместо advance().
  2. В TwitterRequest.swift я обновил подпись NSJSONSerialization, чтобы она соответствовала новой системе обработки ошибок.
person awaxman11    schedule 12.01.2016

У меня только что был большой сеанс исправления файлов пакета Twitter для этой же версии Xcode.

Кажется, что сломалось то, что в этой версии Swift константы ('let x...') могут быть инициализированы только один раз, поэтому, если константе присваивается значение в объявлении ('let x = false'), его нельзя изменить в функции init(). Пакет Twitter дает некоторым константам начальные значения, но затем изменяет значения в функции init().

Мое решение этой проблемы состояло в том, чтобы следовать стилям, предложенным в текущей версии языковой книги Apple Swift: объявить (многие из) констант как неявно развернутые опции, безоговорочно присвоить им значение в функции init() (которое значение может быть nil), затем проверьте, являются ли какие-либо из них нулевыми, и, если да, верните nil из init().

См. https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html, нажмите «На этой странице» и выберите «Неудачные инициализаторы».

Кроме того, в TwitterRequest.swift мне нужно было добавить имя параметра «обработчик:» в пару вызовов для выполненияTwitterRequest(запрос, обработчик: обработчик).

В качестве примера инициализации констант в 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
    }
...
person Bill Evans    schedule 18.04.2015
comment
Билл Эванс, спасибо за оперативный и исчерпывающий ответ на мой вопрос. Пока что я получил классы User и MediaItem для компиляции и в настоящее время работаю над классом Tweet. - person Lee Trent; 20.04.2015
comment
Билл Эванс, не могли бы вы поделиться своим обновленным пакетом Twitter? Мы будем очень признательны. - person Lee Trent; 21.04.2015