SwiftKueryPostgresql 连接失败并出现错误 "Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"
SwiftKueryPostgresql connection fails with error "Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"
我是 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),
]
}
我的 class 上下文:
public class Context {
private let pool : Connection
public init?(pool : Connection?) {
guard pool != nil else { return nil }
self.pool = pool!
}
}
当我在 xcode 上 运行 testConnection()
时,我在第 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"]),
]
)
谢谢
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
错误通常发生在强制展开和可选设置为 nil 时。我会建议而不是做 self.pool = pool!
,你可以做
guard self.pool = pool else {
return nil
}
guard 语句将为您打开可选值,如果不能,则将落入 else。
我注意到的几件事:
- 在您的 Package.swift
中缺少 SwiftKuery
依赖项。
- 您似乎在 testable import myprojet
中输入错误
错误指向的行是 Connection
的 deinit
函数。当 Connection
超出范围或未被另一个对象引用以清除内存时,将调用此函数。您可能在 Connection
被删除后尝试访问它,因此出现错误。
我建议您了解 guard let
在 swift 中的工作原理,但基本上您需要做的是:
public class Context {
private let pool : Connection
public init?(pool : Connection?) {
guard let poolThatIsNotNil = pool else { return nil }
self.pool = poolThatIsNotNil
}
}
我是 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),
]
}
我的 class 上下文:
public class Context {
private let pool : Connection
public init?(pool : Connection?) {
guard pool != nil else { return nil }
self.pool = pool!
}
}
当我在 xcode 上 运行 testConnection()
时,我在第 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"]),
]
)
谢谢
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
错误通常发生在强制展开和可选设置为 nil 时。我会建议而不是做 self.pool = pool!
,你可以做
guard self.pool = pool else {
return nil
}
guard 语句将为您打开可选值,如果不能,则将落入 else。
我注意到的几件事:
- 在您的 Package.swift
中缺少 SwiftKuery
依赖项。
- 您似乎在 testable import myprojet
错误指向的行是 Connection
的 deinit
函数。当 Connection
超出范围或未被另一个对象引用以清除内存时,将调用此函数。您可能在 Connection
被删除后尝试访问它,因此出现错误。
我建议您了解 guard let
在 swift 中的工作原理,但基本上您需要做的是:
public class Context {
private let pool : Connection
public init?(pool : Connection?) {
guard let poolThatIsNotNil = pool else { return nil }
self.pool = poolThatIsNotNil
}
}