我已经阅读了Swift编程语言的基本知识,例如变量,类,函数等。我不明白的是当我开始尝试构建应用程序时,是你的结构如何设置一个功能。我猜是功能,或者我在下面列出的内容。我会详细说明我能做到的。
我想了解人们如何知道,或者在您尝试完成某些事情时应该在哪里学习。
例如,我用Google搜索了一个HTTP调用,然后出现了这个代码:
let request = URLRequest(url: NSURL(string: "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY")! as URL)
do {
// Perform the request
var response: AutoreleasingUnsafeMutablePointer<URLResponse?>? = nil
let data = try NSURLConnection.sendSynchronousRequest(request, returning: response)
我完全迷失了:
URLRequest(url: NSURL(string: "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY")! as URL)
您在哪里阅读以了解何时使用诸如URLRequest之类的内容,或者如何或何时将url:放在其前面。虽然这只是一个例子,但我注意到在构建一个快速的应用程序时,你们会使用诸如NSUrl,NSObject,URLRequest之类的东西。在文档中我还没有了解这些事情。而且我不明白你们怎么知道何时提出问号&#34;?&#34;,或者你如何将你的功能格式化为上面的例子。
如果我没有正确地提出这个问题,我总能解释更多。
如果你知道我可以在网上搜索什么,那么我就可以知道我想要学习什么,那将会有所帮助。或者是一本教你UIWindows的书,以及使用NSObject和UIWindows之类的东西的基本函数。
理解API文档很困难。如果您无法理解api文档和语法。你怎么学习我想它更容易,有时候通过例子来学习。
答案 0 :(得分:4)
好的,因为你的问题并没有因为过于宽泛而被关闭,而且因为它有赞成,我会尝试至少给你一个我认为你真正要求的问题...... < / p>
首先,对于Swift,您想阅读The Swift Programming Language: A Swift Tour。这将为您提供非常好的初学者语言概述以及如何使用它。它包括一个downloadable Swift Playground,其中包含整个导览,让您可以尝试并练习您正在学习的内容。
接下来,当您看到URLRequest
等内容时,可以在Developer Documentation中查找。要获得此文档,您可以搜索名称和文本&#34;开发人员文档&#34;。或者,您可以转到Developer site并从那里搜索。最后,您可以在Xcode的文档窗口中查找:从Xcode菜单,Window - &gt;开发人员文档。
通常,开发者网站也会提供sample code。这真的很酷,因为你可以下载它,玩它,并根据许可证信息,在你自己的代码中使用它。此代码通常还包含注释和说明,可帮助您了解其执行的操作。 示例代码是学习何时以及如何使用您遇到的不同功能的一种非常好的方式!
现在,已经说过,文档本身(与示例代码分开)对于初学者来说可能非常混乱。但是,随着您获得经验,您将更多地了解它试图告诉您的内容。
让我们浏览URLRequest
的{{3}}:
在顶部,您会看到这是Structure
,而不是Class
。在Swift Tour中,您将了解其中的差异。
在名称URLRequest
下,您会看到说明。这里的描述通常与新手的泥浆一样清晰。但是,一些描述之后是关于该项目的详细且非常好的信息。有关此示例,请查看。
在页面的右侧,您可以找到项目何时可用(例如,自iOS 7以来URLRequest
已可用),您需要导入哪个框架才能使用它(Foundation
,这里),以及其他信息的链接。
&#34;主题&#34;列出了可用于执行各种操作的属性和函数。例如,您可能希望&#34;创建请求&#34;或者&#34;使用缓存策略&#34;使用URLRequest
对象。
UIViewController documentation
&#34;关系&#34;为您提供有关项目符合的继承和协议的信息。这些项显示可在给定对象中使用的其他属性和方法。同样,这些可能会让初学者感到困惑,但你最终会得到它。例如,URLRequest
符合Equatable
。这意味着您也可以比较urlRequest1 == urlRequest2
或!=
。
最后,&#34;另见&#34;部分显示了与此相关的其他内容。您可以使用此部分详细了解您可能希望使用的项目以及您当前正在查看的项目。
您选择的具体示例是创建或&#34;实例化&#34;一个新的URLRequest
对象:
URLRequest(url: NSURL(string: "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY")! as URL)
因此,它会使用&#34;主题&#34;关于&#34;创建请求&#34;。这告诉我们:
init(url: URL, cachePolicy: URLRequest.CachePolicy, timeoutInterval: TimeInterval)
Creates and initializes a URL request with the given URL and cache policy.
现在,事实证明&#34;创建请求&#34;这个话题实际上是缺少一个函数。去Swift游乐场,然后进入URLRequest(
,停在左边的paren。您会看到显示两个项目:一个显示上述内容(没有init
部分),另一个显示(url: URL)
。我会在一瞬间回到那里......
新手可能没有意识到他们不需要使用文档中显示的init
部分。如果需要,您可以使用URLRequest.init(...)
,但是您可以将其简化为URLRequest(...)
,其中点代表内部的内容。因此,回到缺少的初始化程序,它应该出现在文档中:
init(url: URL)
这是您的示例实际使用的那个,所以我将继续介绍它。
括号内的部分是&#34;参数&#34;或&#34;参数&#34;。 (这有一个微妙的区别,但是许多开发人员可以互换地使用这两个术语。)你将在Swift Tour中学习,如果需要标签,它就会在那里;否则,它会有一个下划线(_
)。因此,在这里,您必须拥有url:
的标签。如果您在Xcode 9中输入此内容,则会获得:
URLRequest(url: URL)
Xcode提供了您需要拥有的标签,并为您提供了如何填写空白的提示:在url:
标签处,您需要提供URL
- 类型对象。
如果您自己编写函数,标签代表您用来访问该信息的变量名称。由于这是一个Foundation
提供的函数,它是URLRequest初始化函数在其自身内部使用的变量名,隐藏(或#34;封装&#34;)远离您的眼睛,但必须创建一个URLRequest
。
现在,您的示例可以分为两部分。由于他们需要一个URL
对象,因此他们在 url:
参数内创建了。此示例可以分解为以下内容:
let nsURL = NSURL(string: "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY")! as URL
let request = URLRequest(url: nsURL)
然而,NSURL命令实际上来自Objective-C。 (根据经验,任何以NS
开头的东西都来自Objective-C。当它们转换成纯粹的Swift时,NS
就会消失。)Swift拥有它自己的版本NSURL
现在,所以示例代码为&#34; cast&#34;或者在最后将NSURL
更改为URL
。这可以完全用Swift重写为:
let url = URL(string: "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY")
let request = URLRequest(url: url!)
问号表示&#34;可选&#34;值,而感叹号是&#34;强制展开一个可选的&#34;值。这在旅行中讨论,但可能是Swift最令人困惑的方面之一,直到你最终得到它。考虑这个例子:
// This is supposed to be a String value - but it's empty right now ("nil").
// Therefore, I put a '?' on the type name to tell Swift that it's a String,
// but it could be nil (meaning it's value is "optional" - it may be there or not)
let nilString: String? = nil
// I'll go ahead and give the string a value here:
nilString = "I'm not nil anymore."
// Now, I'll use this String value - but I told Swift it might be empty!
// I can tell Swift that I'm CERTAIN a value is present by "force unwrapping" it:
// that is, indicating I'm sure it's not nil by adding a '!'
let newString = nilString! + "testing"
如果我在nil
时尝试使用该值,Swift会对我大喊:fatal error: unexpectedly found nil while unwrapping an Optional value
。
好。我相信我已经涵盖了你实际要求的大部分内容,所以结束了我的#34;书&#34;在SO主人踢我之前!如果我猜对了你正在寻找的东西,你可以把它作为答案。无论哪种方式,阅读Swift Tour,并在编码生涯中走出年轻的padawan!
答案 1 :(得分:3)
这是一个真正可怕的例子,因为他们没有正确使用URL
,他们正在使用已弃用的NSURLConnection
,即使你确实想要使用sendSynchronousRequest
(你也是不要),代码示例尝试捕获响应是完全错误的。
正确的语法是:
let request = URLRequest(url: URL(string: "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY")!)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print(error?.localizedDescription ?? "Unknown error")
return
}
// now use `data` here
}
task.resume()
// but don't try to use `data` here
在回答有关如何理解URLRequest(url:)
语法的问题时,您可以参考documentation for that initialization method。基本上,该文档告诉您URLRequest
结构的这个初始化方法有三个参数,其中第一个参数的名称为url
(第二个和第三个参数都有默认值,所以你只是不必包括它们)。因此,对于名为URLRequest
的结构和一个初始化方法,其唯一必需的参数是名为url
的参数,语法为:
let request = URLRequest(url: requestedURL)
requestedURL
是该请求的URL
实例。
我不会感到惊讶,如果在您更熟悉Swift语言之前很难按照文档页面进行操作,那么我建议您先查看Resources页面,特别是The Swift Programming Guide。值得注意的是,它的Initialization章节描述了如何使用init
方法定义类,以及如何使用特定init
方法实例化对象。但是在浪费任何时间尝试解密代码之前,请仔细阅读整个指南(和/或通过Google查找一些Swift教程)。
正如Vadian指出的那样,因为dataTask
的另一个版本直接接受URL
,我们可以进一步简化:
let url = URL(string: "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
print(error ?? "Unknown error")
return
}
// now use `data` here
}
task.resume()