Получение возвращаемого значения из функции в другом классе - PullRequest
0 голосов
/ 07 мая 2019

У меня есть два класса в swift, TestView() и compileResults().

У меня есть функции в compileResults(), которые возвращают значение.Мне нужно, чтобы это значение вернулось в TestView().

Мне удалось установить значение в compileResults() из TestView(), но я не могу его вернуть.

У меня естьнастроить делегата таким же образом, как я использую делегатов в других местах, но он все еще не дает результатов.

TestView:

import UIKit
import Foundation

class TestView: UIViewController, XMLParserDelegate {

    weak var resStartDelegate: ResStartDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        resStartDelegate?.setConTypeResult(val: "WiFi")
        print("ConType is: ", resStartDelegate?.getConTypeResult()) //outputs value nil
    }

compileResults:

import Foundation

protocol ResStartDelegate: class {
    func getConTypeResult() -> String
    func setConTypeResult(val: String)
}

var testViewDelegate = TestView()

var theTestResults : [String: String] = [
    "conType": ""
]

class complileResults : ResStartDelegate {

    init() {
        setDelegate()
    }

    func setDelegate() {
        testViewDelegate.resStartDelegate = self
    }

    func resetResults() {
        theTestResults["conType"] = ""
    }

    func setConTypeResult(val: String) {
        theTestResults["conType"] = val
        print("Just set contype to: ", theTestResults["conType"]) //prints correctly what has been passed from TestView
    }

    func getConTypeResult() -> String {
        return theTestResults["conType"] ?? "Err"
    }

}

РЕДАКТИРОВАТЬ: Кажется, это работает, как я хочу, что-то не так с этим?

compileResults.swift

import Foundation

class complileResults {//: ResStartDelegate {

    var theTestResults : [String: String] = [
        "conType": "",
        "date": "",
        "time": "",
        "jitter": "",
        "loss": "",
        "dspeed": "",
        "uspeed": "",
        "delay": ""
    ]

    func setConTypeResult(val: String) {
        theTestResults["conType"] = val
    }

    func getConTypeResult() -> String {
        return theTestResults["conType"] ?? "Err"
    }
}

TestView.swift

var comResClass = complileResults()

    class TestView: UIViewController, XMLParserDelegate {

        override func viewDidLoad() {
            super.viewDidLoad()
            comResClass.setConTypeResult(val: "WiFi")
            let ct = comResClass.getConTypeResult()
            print("CT ", ct)
        }
}

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Есть несколько способов сделать это.

    class complileResults {

    var theTestResults : [String: String] = [
        "conType": "",
        "date": "",
        "time": "",
        "jitter": "",
        "loss": "",
        "dspeed": "",
        "uspeed": "",
        "delay": ""
    ]
}

class TestView: UIViewController, XMLParserDelegate {

    let result = complileResults()

    override func viewDidLoad() {
        super.viewDidLoad()
        result.theTestResults["conType"] = "WiFi"
        print(result.theTestResults["conType"] ?? "Err")
    }
}

Или этот, более общий.

class orcomplileResults {

    var theTestResults : [String: String] = [
        "conType": "",
        "date": "",
        "time": "",
        "jitter": "",
        "loss": "",
        "dspeed": "",
        "uspeed": "",
        "delay": ""
    ]

    func setResult(key: String, value: String) {
        theTestResults[key] = value
    }

    func getResult(key: String) -> String {
        return (theTestResults[key] ?? "Err")
    }
}

class orTestView: UIViewController, XMLParserDelegate {

    let result = orcomplileResults()

    override func viewDidLoad() {
        super.viewDidLoad()
        result.setResult(key: "conType", value: "WiFi")
        print(result.getResult(key: "conType"))
    }
}
0 голосов
/ 07 мая 2019

Ваша проблема в том, что complileResults().setConTypeResult(val: "WiFi") отличается от weak var resStartDelegate: ResStartDelegate?, поэтому вы получаете ноль из resStartDelegate.getConTypeResult.

Ваш протокол должен иметь метод setConTypeResult(string) И изменить complileResults().setConTypeResult(val: "WiFi") на resStartDelegate?.setConTypeResult(val: "WiFi")

class TestView: UIViewController, XMLParserDelegate {

    weak var resStartDelegate: ResStartDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        resStartDelegate?.setConTypeResult(val: "WiFi")
        print("ConType is: ", resStartDelegate?.getConTypeResult()) //outputs value nil
    }


protocol ResStartDelegate: class {
    func getConTypeResult() -> String
    func setConTypeResult(val: String)
}
...