Как исправить: использование необъявленного типа «URL» и использование неразрешенного идентификатора «DispatchQueue» в Swift?

Я работал над проектом Swift в Xcode. Я изо всех сил пытался исправить все ошибки, но у меня все еще есть 2, из-за чего мой проект завис, как вы можете видеть в коде ниже: @Error1 и @Error2. Я надеюсь, что вы могли бы мне помочь! Заранее спасибо!

override func viewDidLoad() {
    super.viewDidLoad()

    //Getting the URL of the item
    for item in self.extensionContext!.inputItems {
        if let item = item as? NSExtensionItem {
            for itemProvider in item.attachments! {
                //Going through each item in each input item
                if let itemProvider = itemProvider as? NSItemProvider {
                    if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) {
                        //If the item contains a URL 
                        itemProvider.loadItemForTypeIdentifier(kUTTypeURL as String, options: nil, completionHandler: {(content, error) -> Void in

                         dispatch_async(dispatch_get_main_queue()){

                                if let url = content as? URL /*@Error1*/ {

                                    if url.absoluteString("youtube.com") || url.absoluteString.contains("youtu.be") { //@Error1.1
                                        self.setTitleOfTextView("Video")

                                        //Just in case the app isn't running in the background, write the URL to the shared NSUserDefaults
                                        var existingItems = Constants.sharedDefaults.valueForKey(Constants.videosToAdd)// sharedDefaults.value(forKey: Constants.videosToAdd) as! [String]
                                        existingItems.append(url.absoluteString) //@Errror1.2
                                        //Constants.sharedDefaults.set(existingItems, forKey: Constants.videosToAdd)
                                        //Constants.sharedDefaults.synchronize()
                NSUserDefaults.standardUserDefaults().setInteger(yourScore, forKey: "highScore")
                                         NSUserDefaults.standardUserDefaults().synchronize()

                                        //Passing URL    
                                       self.wormhole.passMessageObject(url.absoluteString as NSCoding?, identifier: "youTubeUrl")


                                    return
                                    }
                                }

                                self.setTitleOfTextView("Invalid URL.")
                            }
                        })
                    }
                }
            }
        }
    }
}

@Error1: 'Использование необъявленного типа URL'.

Обратите внимание, что content из if let url = **content** as? URL {...} объявляется как: let content: NSSecureCoding?.

Обновление: если я изменю URL на NSURL, я получу еще 2 ошибки:

@Error1.1 (if url.absoluteString("youtube.com") || url.absoluteString.contains("youtu.be") {...}): Невозможно вызвать значение нефункционального типа String.

@Error1.2 ( existingItems.append(url.absoluteString)): Значение типа AnyObject? не имеет члена append.

func setTitleOfTextView(_ text: String) {
    self.mainLabel.text = text

    DispatchQueue.main.asyncAfter(deadline: dispatch_time_t() + Double(Int64(3 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) /*@Error2*/ {

        UIView.animate(withDuration: 0.25, animations: {
            self.view.alpha = 0
        }, completion: { completed in
            self.extensionContext?.completeRequest(returningItems: nil) { completed in
                self.dismiss(animated: true, completion: nil)
            }
        })
    }
}

@Error2: 'Использование неразрешенного идентификатора DispatchQueue'.

Обновление: если я изменяю DispatchQueue.main.asyncAfter(deadline: dispatch_time_t() + Double(Int64(3 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) {...} на dispatch_after(dispatch_time_t(), Int64((3 * Double(NSEC_PER_SEC)) / Double(NSEC_PER_SEC)) ) {...}, я все равно получаю сообщение об ошибке: Тип аргумента Int64 не соответствует ожидаемому типу dispatch_queue_t (он же OS_dispatch_queue).


person Razvan Julian    schedule 17.12.2016    source источник
comment
Эти типы были представлены в Swift 3. Какую версию вы используете?   -  person Martin R    schedule 17.12.2016
comment
@MartinR Я использовал Apple Swift версии 2.2.   -  person Razvan Julian    schedule 17.12.2016


Ответы (2)


Я думаю, вы можете попробовать следующее:

  1. Используйте NSURL вместо URL.

  2. Использовать:

    dispatch_after(deadline:dispatch_time_t() +Int64((3 * Double(NSEC_PER_SEC)) / Double(NSEC_PER_SEC)), dispatch_get_main_queue()) {
    

    вместо:

    DispatchQueue.main.asyncAfter(deadline: dispatch_time_t() + Double(Int64(3 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)) {`
    
person 3stud1ant3    schedule 17.12.2016
comment
@Error1: Использование «NSURL» вместо «URL» вызовет ошибки еще в двух местах: «if url.absoluteString(youtube.com) || url.absoluteString.contains(youtu.be) {' и 'existingItems.append(url.absoluteString)'. @Error2: изменение синтаксиса, я думаю, сработало, но я все равно получил: Невозможно преобразовать значение типа «Double» в ожидаемый тип аргумента «UInt64». - person Razvan Julian; 17.12.2016
comment
@RazvanJulian, не могли бы вы рассказать мне, в чем ошибка в случае 1 и в случае 2, я обновил свой ответ, пожалуйста, проверьте - person 3stud1ant3; 17.12.2016
comment
Я считаю, что ошибка 1.1 связана с тем, что вы вызываете конструктор String вместо метода, когда пишете if (url.absoluteString(youtube.com)) вместо этого должно быть if (url.absoluteString.contains(youtube.com)) . Теперь, что касается ошибки 1.2, я считаю, что вы должны указать значение existsItems как [String], потому что, как говорит ошибка, нет метода с именем append для AnyObject. Пожалуйста, проверьте. - person 3stud1ant3; 18.12.2016

Пытаться бороться с этим фрагментом кода в Swift 2.2 (используя Xcode 7) довольно странно... После того, как вы исправили один, появляется другой. Переход на Swift 3Xcode 8) делает все быстро и чисто.

person Razvan Julian    schedule 22.12.2016