如何解决:在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
fromif let url = **content** as? URL {...}
, is declared as:let content: NSSecureCoding?
.Update: If I change the
URL
intoNSURL
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 typeString
.@Error1.2 (
existingItems.append(url.absoluteString)
): Value of typeAnyObject?
has no memberappend
.
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)) {...}
intodispatch_after(dispatch_time_t(), Int64((3 * Double(NSEC_PER_SEC))/Double(NSEC_PER_SEC))) {...}
, I still get the error: Argument typeInt64
does not conform to expected typedispatch_queue_t
(akaOS_dispatch_queue
).
试图在夫特2.2(使用的Xcode 7)这一段代码斗争是有点儿怪异......固定之后,另一个出来。 切换到Swift 3(在Xcode 8)使一切都快速和干净。
我想你可以尝试以下方法:
使用NSURL,而不是URL。
-
使用:
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)) {`
** @ Error1 **:如果使用'NSURL'而不是'URL',则会在另外两处导致错误:'if url.absoluteString(“youtube.com”)|| url.absoluteString.contains(“youtu.be”){'和'existingItems.append(url.absoluteString)'。 ** @ Error2 **:更改语法我猜测它的工作原理,但是我仍然得到:_Cannot将类型'Double'的值转换为期望的参数类型'UInt64'_。 –
@RazvanJulian你能告诉我在案件1和案件2中的错误吗?我已经更新了我的答案,请检查 – 3stud1ant3
我刚刚更新了我的问题。请看一下。 –
这些类型是在Swift ** 3 **中引入的。你使用哪个版本? –
@MartinR我使用Apple Swift 2.2版。 –