2015-05-06 19 views
3

這是我的代碼。看來,當我繼承UIColor,使其equatable我得到一個內存錯誤。這是爲什麼?實現快速等值協議會導致訪問錯誤。爲什麼?

class MyColor: UIColor, Equatable { 
    var name: String 


    init(name: String, r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat = 1.0) { 
     self.name = name 
     super.init(red: r, green: g, blue: b, alpha: a) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

func == (lhs: MyColor, rhs: MyColor) -> Bool { 
    return lhs.name == rhs.name 
} 

let test1 = MyColor(name: "coolRed", r: 10, g: 12, b: 22) 

let test2 = MyColor(name: "coolBlue", r: 10, g: 12, b: 22) 


if test1 == test2 { 
    println("hey") 
} 

enter image description here

+0

可能無關的錯誤,但是您的代碼不是來自'MyColor任何不同(名: 「coolRed」 中,r:1,G 1,B:1)'和'MyColor(名稱:「 coolBlue「,r:1,g:1,b:1)' – nhgrif

+0

我知道實際的顏色沒有任何不同,但與錯誤無關..這不是完美的代碼。我附上了錯誤的屏幕截圖 – hamobi

+0

對於任何感興趣的人,只需將此問題中的代碼複製並粘貼到沙盒中即可生成相同的錯誤。 – nhgrif

回答

2

的UIColor是一類集羣,子類應該避免。

你可以使用Objective-C運行時來獲得你想要的功能。

這段代碼是「操場就緒」的。

import UIKit 

let _nameKey = malloc(4) 

extension UIColor : Equatable { 

var name : String { 
    get { 
     return objc_getAssociatedObject(self, _nameKey) as! String 
    } 
    set { 
     objc_setAssociatedObject(self, 
      _nameKey, 
      newValue, 
      UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     ); 
    } 
} 
} 


public func ==(lhs: UIColor, rhs: UIColor) -> Bool { 
    return lhs.name == rhs.name 
} 

let aRed = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.0) 
aRed.name = "Red" 
aRed.name 

let anotherRed = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.0) 
anotherRed.name = "Red" 

aRed == anotherRed 
相關問題