2017-06-08 1 views
0

J'ai récemment essayé sans succès d'ajouter une propriété conforme UIApperance à une de mes classes Swift (ScoreView). Vous pouvez voir le code correspondant ci-dessous:Quels types de propriétés Swift sont autorisés dans les classes personnalisées compatibles UIApperance?

private var gaugeThresholds = Array<GaugeThreshold?>(repeating: nil, count: ScoreView.maxGaugeIntervals) 

public func gaugeThreshold(forInterval interval: Int) -> GaugeThreshold? { 
    return (0 <= interval && interval < ScoreView.maxGaugeIntervals) ? self.gaugeThresholds[interval] : nil 
} 

public func setGaugeThreshold(_ threshold: GaugeThreshold, forInterval interval: Int) { 
    if 0 <= interval && interval < ScoreView.maxGaugeIntervals { 
     self.gaugeThresholds[interval] = threshold 
    } 
} 

GaugeThreshold est une struct Swift:

public struct GaugeThreshold { 
    let until: Float 
    let color: UIColor 

    public init(until: Float, color: UIColor) { 
     self.until = until 
     self.color = color 
    } 
} 

Ce échouait lamentablement, et la seule raison pour laquelle je peux penser à cet échec est le fait que J'utilise un type personnalisé pour la propriété au lieu de l'un des types standard.

Selon UIAppearanceContainer documentation: Le type de propriété peut être tout type iOS standard: id, NSInteger, NSUInteger, CGFloat, CGPoint, CGSize, CGRect, UIEdgeInsets ou UIOffset. Mais si vous parcourez le list of methods and properties conforming to UIAppearance as of iOS 8.0, vous pouvez voir qu'il y a d'autres types qui fonctionnent correctement comme UIImage, UIColor ... donc quelqu'un sait ce qui rend un type valide pour être utilisé comme propriété UIAppearance?

Répondre

0

Bien sûr, rien de tel que l'affichage à StackOverflow pour trouver la réponse cinq minutes plus tard. Il s'avère que la clé est le type id. Changement

public struct GaugeThreshold { ... 

à

public class GaugeThreshold: NSObject { ... 

a fait l'affaire.