gpt4 book ai didi

ios - 符合协议(protocol)的Swift类,如何将其作为参数传递?

转载 作者:行者123 更新时间:2023-11-28 08:59:44 25 4
gpt4 key购买 nike

我有两个类,一个 View Controller 和一个自定义类。我在自定义类中定义了一个协议(protocol),我的 View Controller 符合该协议(protocol)。现在,我希望能够从我的自定义类中随时调用 View Controller 的符合方法。我想我可以像 Java 处理接口(interface)的方式那样做,我将 View Controller 对象传递给自定义类,然后根据需要调用该对象。这是我的代码:

为了尝试实现这一点,我将 View Controller 对象作为参数传递给 BLEScanner.getInstance() 方法:

var scanner = BLEScanner.getBLEInstance(this)

但是 Xcode 一直给我这个错误:

Cannot invoke getBLEInstance with an argument list of type (FirstViewController).

如何将我的 View Controller 对象作为 BLEScannerProtocol 传递给 BLEScanner getInstance 方法?

BLEScanneer 代码:

@objc public protocol BLEScannerProtocol
{
func someTypeMethod() -> Double
}

public class BLEScanner : NSObject, CBCentralManagerDelegate,ZestMsg_ZestMsgCallback, DataManager_DataManagerResponse {

var tagDictionary = [String:IflexBluetoothTag]()
let tagTimeoutIntervalSeconds = 60

public func ResultWithNSString(data: String!)
{
}

public func ResponseWithNSString(rsp: String!) {
}

private static var centralManager : CBCentralManager!
private static var sensorTagPeripheral : CBPeripheral!
private static var mDataManager = DataManager()!
private static var debugFirstMsg = false;
private static let sharedInstance = BLEScanner()
private var currentProtocol:BLEScannerProtocol!

public override init() {
println("Instantiated BLEScanner")
}

private static var isRunning = false;
func getBLEInstance(media: BLEScannerProtocol) -> BLEScanner
{
if (!BLEScanner.isRunning)
{
BLEScanner.instantiateBLEScanner()
let qualityOfServiceClass = DISPATCH_QUEUE_PRIORITY_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue,{

BLEScanner.mDataManager.Start()

dispatch_async(dispatch_get_main_queue(), { () -> Void in
println("Test")
})
})
}
//

return BLEScanner.sharedInstance
}
}

这是我的 ViewController

class FirstViewController: UIViewController, UITableViewDataSource,UITableViewDelegate, BLEScannerProtocol {

var items: [String] = ["We", "Heart", "Swift"]
var centralManager : CBCentralManager!
var sensorTagPeripheral : CBPeripheral!
var scanner : BLEScanner!

@IBOutlet weak var songLabel: UILabel!
@IBOutlet var tableView: UITableView!
@IBOutlet weak var timeLabel: UILabel!

@IBAction func playPauseAction(sender: UIButton) {
}

override func viewDidLoad() {
super.viewDidLoad()

var scanner = BLEScanner.getBLEInstance(self)
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items.count;
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell

cell.textLabel?.text = self.items[indexPath.row]

return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
println("You selected cell #\(indexPath.row)!")
}

func someTypeMethod() -> Double
{
println("Instantiating BLEScanner")
return 5.0
}
}

最佳答案

您可以使用泛型和泛型约束。

func getBLEInstance<T: BLEScannerProtocol>(media: T) -> BLEScanner {
media.someTypeMethod()
}

这表示该函数采用通用类型,但实现了 BLEScannerProtocol。

在评论中编辑请求。

你可以实现你想要的,你只需要将通用类型移动到类级别并创建一个属性来保存 View Controller 。这是一个简化的示例。

protocol BLEScannerProtocol {
func someTypeMethod() -> Double
}

class BLEScanner<T: BLEScannerProtocol> {
var media: T!

func getBLEInstance(m: T) -> BLEScanner {
media = m
}

func someOtherMethod() {
media.someTypeMethod()
}
}

请注意,媒体要么需要是可选的,要么是隐式展开的可选的,因为它不能在初始化期间设置值。

关于ios - 符合协议(protocol)的Swift类,如何将其作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32237317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com