Соединение SwiftKueryPostgresql завершается с ошибкой «Поток 1: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)» - PullRequest
0 голосов
/ 05 июля 2018

Я довольно новичок в 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, я получаю SwiftKuery / ConnectionPool.swift на строке 129 с этой ошибкой

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"]),
    ]
)

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я предлагаю вам узнать, как guard let работает быстро, но вот в основном то, что вам нужно сделать:

public class Context {
    private let pool : Connection

    public init?(pool : Connection?) {
        guard let poolThatIsNotNil = pool else { return nil }
        self.pool = poolThatIsNotNil
    }
}
0 голосов
/ 05 июля 2018

Ошибка Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) обычно возникает при принудительном развертывании и необязательна, для которой установлено значение ноль. Я бы предложил вместо того, чтобы делать self.pool = pool!, вы можете сделать guard self.pool = pool else { return nil } Защитное утверждение развернет необязательное значение для вас, а если не сможет, упадет на другое.

Несколько вещей, которые я заметил: - В вашей Package.swift зависимости SwiftKuery отсутствует. - Кажется, у вас есть опечатка в testable import myprojet

Строка, на которую указывает ошибка, является функцией deinit для Connection. Эта функция вызывается, когда Connection находится вне области видимости или не упоминается другим объектом для очистки памяти. Возможно, вы пытаетесь получить доступ к Connection после того, как он был удален, что приводит к появлению ошибки.

...