如何解决:在Swift中使用未声明的类型'URL'和使用未解析标识符'DispatchQueue'?

问题描述:

我曾在Xcode的Swift项目中工作过。我努力修复所有的错误,但我仍然有2,保持我的项目卡住,你可以看到下面的代码:@ Error1 and @ Error2。 我希望你能帮助我!先谢谢你!如何解决:在Swift中使用未声明的类型'URL'和使用未解析标识符'DispatchQueue'?

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: 'Use of undeclared type URL '.

Please, note that content from if let url = **content** as? URL {...} , is declared as: let content: NSSecureCoding? .

Update: If I change the URL into NSURL I would get 2 more errors to:

@Error1.1 (if url.absoluteString("youtube.com") || url.absoluteString.contains("youtu.be") {...}): Cannot call value of non-function type String.

@Error1.2 ( existingItems.append(url.absoluteString)): Value of type AnyObject? has no member 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: 'Use of unresolved identifier DispatchQueue '.

Update: If I change DispatchQueue.main.asyncAfter(deadline: dispatch_time_t() + Double(Int64(3 * Double(NSEC_PER_SEC)))/Double(NSEC_PER_SEC)) {...} into dispatch_after(dispatch_time_t(), Int64((3 * Double(NSEC_PER_SEC))/Double(NSEC_PER_SEC))) {...} , I still get the error: Argument type Int64 does not conform to expected type dispatch_queue_t (aka OS_dispatch_queue).

+1

这些类型是在Swift ** 3 **中引入的。你使用哪个版本? –

+0

@MartinR我使用Apple Swift 2.2版。 –

试图在夫特2.2(使用的Xcode 7)这一段代码斗争是有点儿怪异......固定之后,另一个出来。 切换到Swift 3(在Xcode 8)使一切都快速和干净。

我想你可以尝试以下方法:

  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)) {` 
    
+0

** @ Error1 **:如果使用'NSURL'而不是'URL',则会在另外两处导致错误:'if url.absoluteString(“youtube.com”)|| url.absoluteString.contains(“youtu.be”){'和'existingItems.append(url.absoluteString)'。 ** @ Error2 **:更改语法我猜测它的工作原理,但是我仍然得到:_Cannot将类型'Double'的值转换为期望的参数类型'UInt64'_。 –

+0

@RazvanJulian你能告诉我在案件1和案件2中的错误吗?我已经更新了我的答案,请检查 – 3stud1ant3

+0

我刚刚更新了我的问题。请看一下。 –