Swift 4.3 - 在 2 个文件之间传递数据的协议

Swift 4.3 - protocols passing data between 2 files

我正在努力理解协议的工作原理。我有 2 个文件,想使用协议来传递数据...这就是我正在做的:

在ViewController.swift

protocol workingProtocol { func myFunc(strValue: String)}    

class ViewController: UIViewController {
  var interactor = workingProtocol
  @objc func doneBtn() {
     interactor.myFunc(strValue: "str")
  }
}

在Interactor.swift

class Interactor {
 func myFunc(strValue: String) {
   print(strValue)
 }
}

未从 Interactor.swift

打印数据

不幸的是,我看不到你是如何注入交互的class,而且你的代码在语法上也有一些问题。它应该是这样的:

protocol WorkingProtocol: AnyObject {
 func myFunc(strValue: String)
}    

final class ViewController: UIViewController {

  var interactor: WorkingProtocol

  @objc func doneBtn() {
     interactor.myFunc(strValue: "str")
  }
}

final class Interactor: WorkingProtocol {

 func myFunc(strValue: String) {
   print(strValue)
 }
}

以及使用方法:

let interactor: WorkingProtocol = Interactor()
let vc = ViewController(interactor: interactor)

vc.doneBtn()

协议定义了 蓝图 方法、属性和其他满足某项功能的要求。

这是一个关于它如何根据您的代码工作的示例

protocol ProtocolName {
 func functionName(strValue: String)
}

class ViewController {
  var interactor: ProtocolName? = nil

  @objc
  fileprivate func doneBtn() {
    interactor?.functionName(strValue: "Passing data to interactor using protocols")
  }
}

class Interactor: ProtocolName {
  func functionName(strValue: String) {
    print("Showing value\n", strValue)
  }
}

let interactor = Interactor()
let viewController = ViewController()
viewController.interactor = interactor
viewController.doneBtn()

另一个例子:

protocol ProtocolName {
 func functionName(strValue: String)
}

class ViewController1 {
  let interactor = Interactor1()

  /// Init or viewDidLoad() if you're using ViewController classes.
  init() {
    interactor.delegate = self
  }
}

extension ViewController1: ProtocolName {
  func functionName(strValue: String) {
    print("Printing the value: \(strValue)")
  }
}

class Interactor1 {
  var delegate: ProtocolName?

  func someAction() {
    delegate?.functionName(strValue: "Executed action in interactor.")
  }
}

let vc = ViewController1()
vc.interactor.someAction()