我正在Swift中编写一些代码来学习语言.这是我的基类:
import Foundation
class BaseCommand:NSOperation
{
var status:Int? = nil
var message:String? = nil
func buildRequest() -> NSData?
{
return nil
}
func parseResponse(data:NSData?) -> (Status:Int, Error:String)
{
return (200, "Success")
}
override func main() {
let requestBody = self.buildRequest()
println("Sending body \(requestBody)")
// do network op
var networkResultBody = "test"
var resultBody:NSData = networkResultBody.dataUsingEncoding(NSUTF8StringEncoding)!
(self.status, self.message) = self.parseResponse(resultBody)
}
}
Run Code Online (Sandbox Code Playgroud)
问题出在最后一行:
(self.status, self.message) = self.parseResponse(resultBody)
Run Code Online (Sandbox Code Playgroud)
编译器说"无法将元组转换(状态:Int,错误:字符串)表示为(Int?,String?)"
我知道问题是self.status和self.message是可选项,而parseResponse不返回Optionals(我不想要它).如何告诉它进行必要的分配和转换以将数据导入实例变量?
我正在尝试在我正在开发的ActiveSync客户端中实现证书身份验证.使用证书身份验证的代码可能有效,但截至目前服务器,或者更准确地说,iOS库对服务器响应的解释似乎对我不正确.这是我的代码:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSURLProtectionSpace *protectionSpace = [challenge protectionSpace];
NSString *authenticationMethod = [protectionSpace authenticationMethod];
if ([authenticationMethod isEqualToString:NSURLAuthenticationMethodClientCertificate])
{
NSURLCredential* credential = [ self buildCredentialClientCert];
if ( credential == nil )
{
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
else
{
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
}
else if ([authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
.... // do other stuff
Run Code Online (Sandbox Code Playgroud)
问题是,即使我知道服务器支持客户端证书身份验证,当我设置断点时authenticationMethod,总是设置为NSURLAuthenticationMethodServerTrust.
原始HTTPS服务器响应包含以下内容:
错误代码:403禁止.该页面需要客户端证书作为身份验证过程的一部分.如果您使用的是智能卡,则需要插入智能卡以选择合适的证书.否则,请与服务器管理员联系.(12213)
我的问题是,什么决定如果认证挑战是NSURLAuthenticationMethodServerTrust对NSURLAuthenticationMethodClientCertificate?
我试图在Swift中做一些使用KVC在Objective-C中很容易做到的事情.iOS9中添加的新Contacts框架在大多数情况下比旧的AddressBook API更容易使用.但通过手机号码找到联系人似乎很困难.提供查找联系人的谓词仅限于名称和唯一标识符.在Objective-C中,您可以获取所有联系人,然后使用NSPredicate过滤KVC查询.结构是:
CNContact-> phoneNumbers - >(String,CNPhoneNumber-> stringValue)
在下面的代码中假设我通过以下方式获取了联系人:
let keys = [CNContactEmailAddressesKey,CNContactPhoneNumbersKey, CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName)]
let fetchRequest = CNContactFetchRequest(keysToFetch: keys)
var contacts:[CNContact] = []
try! CNContactStore().enumerateContactsWithFetchRequest(fetchRequest) { ...
Run Code Online (Sandbox Code Playgroud)
我想将stringValue与已知值进行比较.这是我到目前为止在游乐场所拥有的:
import UIKit
import Contacts
let JennysPhone = "111-867-5309"
let SomeOtherPhone = "111-111-2222"
let AndAThirdPhone = "111-222-5309"
let contact1 = CNMutableContact()
contact1.givenName = "Jenny"
let phone1 = CNPhoneNumber(stringValue: JennysPhone)
let phoneLabeled1 = CNLabeledValue(label: CNLabelPhoneNumberMobile, value: phone1)
contact1.phoneNumbers.append(phoneLabeled1)
let contact2 = CNMutableContact()
contact2.givenName = "Billy"
let phone2 = CNPhoneNumber(stringValue: SomeOtherPhone)
let …Run Code Online (Sandbox Code Playgroud) 我在玩Hackerrank时遇到了这个问题。
它写为:
您将得到一个正整数N。必须打印高度为N?1的数字三角形,如下所示:
1
22
333
4444
55555
......
Run Code Online (Sandbox Code Playgroud)
我立即想到的是这种解决方案:
for i in range(1,input()):
print(str(i)*i)
Run Code Online (Sandbox Code Playgroud)
它将给定的(5)作为输入的第一行输出:
1
22
333
4444
Run Code Online (Sandbox Code Playgroud)
呈件说这是不对的。在我看来,其他被接受的建议不太优雅:
for i in range(1,int(input())):
print((10**i)//9*i)
Run Code Online (Sandbox Code Playgroud)
输出:
1
22
333
4444
Run Code Online (Sandbox Code Playgroud)
输出是相同的,但是代码很丑陋。为什么这个解决方案可以接受而不是我的?
我有一个控制一些资源的功能,例如:
var resource: Int?
func changeSomeResources() {
resource = 1
// rewriting keychain parameters
// working with UIApplication.shared
}
Run Code Online (Sandbox Code Playgroud)
然后我多次将此函数添加到全局线程
DispatchQueue.global(qos: .userInitiated).async {
changeSomeResources()
}
DispatchQueue.global(qos: .userInitiated).async {
changeSomeResources()
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,除了竞争条件之外,我是否会遇到一些线程问题?例如,如果两个函数将尝试同时更改资源