Swift和SecTrust

我遇到一些麻烦,试图将我在Apple文档中find的代码转换为swift代码。 准确地说,这是关于TSL和证书的东西…

https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html

这是Objective-C中的原始代码

SecTrustResultType secresult = kSecTrustResultInvalid; if (SecTrustEvaluate(trust, &secresult) != errSecSuccess) return; } 

这是我的尝试…

 var secresult:SecTrustResultType = kSecTrustResultInvalid // ERROR 1 if (SecTrustEvaluate(trust, &secresult) != errSecSuccess) { // ERROR 2 return; } 

错误1是:

 'Int' is not convertible to 'SecTrustResultType' 

错误2是:

  Could not find an overload for '!=' that accepts the supplied arguments 

现在,我看到SecTrustResultType是一个UInt32kSecTrustResultInvalid是一个Int …但是这个头文件是由Apple定义的,所以我认为它应该是正确的:P

 typealias SecTrustResultType = UInt32 var kSecTrustResultInvalid: Int { get } 

关于第二个错误我真的不知道如何pipe理它,因为函数SecTrustEvaluate返回一个OSStatus (这是UInt32的别名), errSecSuccess也是一个OSStatus

我很困惑。 你有任何build议,使这个东西工作!

我自己遇到这个问题,头文件有点混乱,特别是因为常量被定义为Int和SecTrustResultType被定义为UInt32

但是好消息是,解决方法相当简单,只需使用kSecTrustResultInvalid初始化kSecTrustResultInvalid

 var secresult = SecTrustResultType(kSecTrustResultInvalid) if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ return; } 

Swift 2.3

 var secresult = SecTrustResultType.Invalid if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ return; } 

在Swift 3.0中仍然是一样的:

 var secresult = SecTrustResultType.Invalid if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ return; }