2015-01-18 6 views
0

UPDATEнет доступных initializaers, Swift Singleton

просто пытался удалить

init(delegate: MPPlayerDelegate) { 
self.delegate = delegate 
} 

и делать, как мне сказали, что с

var updateLabel: MPPlayerDelegate = MPPlayerSingleton() 

в UIVIewcontroller.swift

, но до сих пор проблема. MPPlayerDelegate не имеет члена имени делегата

Я пытаюсь построить синглтон с делегатом, чтобы он мог обновить UILabel с информацией он получает из HTTP потока «Радио»

я» м получают ошибку

MPPlayerDelegate cannont быть построен, поскольку он не имеет доступного initializaers

MPPlayerSingleton.swift

@objc protocol MPPlayerDelegate{ 
func updateLabel(artist: String, title: String) 

} 


public class MPPlayerSingleton : NSObject, MPPlayerDelegate { 

var delegate: MPPlayerDelegate? 

init(delegate: MPPlayerDelegate) { 
    self.delegate = delegate 


} 


let songInfo = NSMutableDictionary() 
var moviePlayer = MPMoviePlayerController() 
var uiView = UIView() 

var informationMetaTitle: String! 
var informationMetaArtist: String! 

class var shared: MPPlayerSingleton { 

    struct Static { 
     static var instances: MPPlayerSingleton? 
     static var token: dispatch_once_t = 0 

    } 
    dispatch_once(&Static.token) { 
     Static.instances = MPPlayerSingleton(delegate: MPPlayerDelegate()) // **This is where the error is** 
    } 

    return Static.instances! 
} 



func updateLabel(artist: String, title: String) { 

} 

UIViewController.swift

var updateLabel: MPPlayerDelegate = MPPlayerDelegate() // **same error here** 
    updateLabel.delegate = self // says there is no delegate 

ответ

1

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

Ваше объявление протокол штрафа:

@objc protocol MPPlayerDelegate { 
    func updateLabel(artist: String, title: String) 
} 

В вашем MPPlayerSingleton классе, вы не хотите, инициализатор с делегатом, так что необходимо будет установить с помощью кода клиента. Избавьтесь от этого и NSObject «пусто init() будут доступны, решая большинство ваших проблем:

public class MPPlayerSingleton : NSObject, MPPlayerDelegate { 
    var delegate: MPPlayerDelegate? 
    // ... 

    // Cleaned-up singleton 
    class var shared: MPPlayerSingleton { 
     struct Static { 
      static var instance = MPPlayerSingleton() 
     } 
     return Static.instance 
    } 
} 

Теперь вы можете установить delegate к одному из контроллеров зрения, которая является то, что вы, вероятно, хотите в этом случае:

class MyViewController: UIViewController, MPPlayerDelegate { 
    override func viewDidLoad() { 
     MPPlayerSingleton.shared.delegate = self 
    } 

    // MARK: - MPPlayerDelegate 

    func updateLabel(artist: String, title: String) { 
     // ... 
    } 
} 
0

Я предполагаю, что вы имели в виду:

var updateLabel: MPPlayerDelegate = MPPlayerSingleton() 
+0

Нет кубиков ... ошибка все еще сохраняется в файле singleton, как я написал и показал. на линии с ** Static.instances ** – KennyVB

Смежные вопросы