1

我对 Swift 很陌生,尤其是 Kitura。我正在使用SwiftKueryPostgresql处理与数据库的通信。

我正在为特定项目编写 ORM 库。我正在像这样测试我的连接(正如我从文档中理解的那样):

import Foundation
import SwiftKuery
import SwiftKueryPostgreSQL
import XCTest
@testable import myprojet

final class project_ormTests: XCTestCase {
    var context: Context? = Context(pool: PostgreSQLConnection.createPool(host: "localhost", port: 5432, options: [.databaseName("project"), .userName("myproject"), .password("")], poolOptions: ConnectionPoolOptions(initialCapacity: 3)).getConnection())
    }

    func testConnection() {

        XCTAssertNotNil(context)
    }

    static var allTests = [
        ("testConnection", testConnection),
    ]
}

我的班级背景:

public class Context {
    private let pool : Connection

    public init?(pool : Connection?) {
        guard pool != nil else { return nil }
        self.pool = pool!
    }
}

当我testConnection()在 xcode 上运行时,我在第 129 行到达 SwiftKuery/ConnectionPool.swift 并出现此错误

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 

我究竟做错了什么 ?有什么我错过的吗?我真的不知道该怎么办...

这是我的 Package.swift 如果有帮助的话

import PackageDescription

let package = Package(
    name: "project",
    products: [
        .library(
            name: "projet",
            targets: ["project"]),
    ],
    dependencies: [
        .package(url: "https://github.com/IBM-Swift/Swift-Kuery-PostgreSQL.git", from: "1.2.0")
    ],
    targets:[
        .target(
            name: "project",
            dependencies: ["SwiftKueryPostgreSQL"]),
        .testTarget(
            name: "projectTests",
            dependencies: ["project"]),
    ]
)

谢谢

4

2 回答 2

1

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)强制展开和可选设置为 nil 时,通常会发生错误。我建议self.pool = pool!你可以做 而不是做 guard self.pool = pool else { return nil } 守卫语句将为你解开可选值,如果它不能 if 将落入 else 。

我注意到了一些事情: - 在您Package.swiftSwiftKuery依赖项中丢失了。- 看来你有一个错字testable import myprojet

错误指向的行deinitConnection. Connection当超出范围或未被另一个对象引用以清除内存时,将调用此函数。您可能试图Connection在它被删除后访问它,从而得到一个错误。

于 2018-07-05T13:31:15.433 回答
0

我建议你快速学习如何guard let工作,但这基本上是你需要做的:

public class Context {
    private let pool : Connection

    public init?(pool : Connection?) {
        guard let poolThatIsNotNil = pool else { return nil }
        self.pool = poolThatIsNotNil
    }
}
于 2018-07-05T17:04:04.637 回答