【问题标题】:Different valid code examples throw same errors不同的有效代码示例会引发相同的错误
【发布时间】:2016-08-31 03:35:40
【问题描述】:

我正在尝试使用 TCP SSL 连接 openssl s_server 和 iOS 客户端(另外,我得到了 another issue with this,可能与此相关)。现在我正在尝试使用这个sample code from github

let mainbun = NSBundle.mainBundle().pathForResource("pd-test", ofType: "cer")
var key: NSData = NSData.dataWithContentsOfMappedFile(mainbun!)! as NSData
var cert:SecCertificateRef =
SecCertificateCreateWithData(kCFAllocatorDefault, key).takeRetainedValue()

var err:OSStatus = noErr

let secDict = NSDictionary(
    objects: [kSecClassCertificate,cert],
    forKeys: [kSecClass, kSecValueRef]
)


SecItemAdd(secDict as CFDictionaryRef, nil);

但得到错误:

ViewController.swift:67:74: 'AnyObject' is not convertible to 'NSData'; did you mean to use 'as!' to force downcast? 

ViewController.swift:69:9: Value of type 'SecCertificate?' has no member 'takeRetainedValue' 

ViewController.swift:75:23: Value of type 'CFString' does not conform to expected element type 'NSCopying'

为什么我不能构建有效的代码(我看到很多这样的示例,它们都抛出几乎相同的错误,例如this)?我该如何解决?

【问题讨论】:

    标签: ios swift xcode ssl


    【解决方案1】:

    为什么我不能构建有效的代码

    这是因为 Swift 语言在不断发展;您使用的 Swift 版本比编写它们时使用的示例要新。当时它是有效的 Swift,但它不适用于 您的 版本的 Swift。

    (如果你要下载 Xcode 8 种子 6,第一行 甚至都无法编译;现在没有 NSBundle 这样的东西,也没有 mainBundle() 这样的东西,并且没有 pathForResource 这样的东西。这显示了 Swift 语言可以发生多么彻底的变化。)

    【讨论】:

    • 如何降级我在 Xcode 中使用的 Swift 版本?或者以某种方式自动解决这个问题?因为我已经手动修改了这段代码,现在它不起作用(或者我有created invalid ssl certificate,但有些用户写的是正确的方式)
    • "我如何降级我在 Xcode 中使用的 Swift 版本" 您需要知道代码是用哪个版本的 Swift 编写的,并使用包含该版本的 Xcode 版本。 Apple 提供所有旧版本的 Xcode。 “或者以某种方式自动解决这个问题”您可能无法完全自动解决它,但是如果您了解 Swift,您得到的编译器错误非常清晰且易于修复。至于使用 OpenSSL,Stack Overflow 已经有很多有用的信息了。
    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多