是否可以使用泛型类型来接收String和NSString Type参数?

时间:2015-08-07 09:27:50

标签: ios swift generics nsstring

最近,我正在研究我们公司产品的新UI。并调整iphone 6 plus的文字大小对我来说真的是一个问题。我甚至没有找到一种优雅的方式。然而,我对一些任务期间称为“奖金”的题外话感到好奇。 (事实上​​,这是我对这个问题的主要怀疑)。

我想出的文本大小的解决方案是使用fontdescriptor来改变点大小,这样我就可以将这个技巧应用于任何字体样式。我使用Bond绑定来观察文本的变化。

lazy var bondFontSizeForIP6P = Bond<(NSAttributedString, UILabel)>{ (s, label) in
    if SRDevice.getVersion == .IPHONE6PLUS{
        let scaleFactor:CGFloat = 1.3
        let fd = label.font.fontDescriptor()
        let pointSize = fd.pointSize * scaleFactor
        let font = UIFont(descriptor: fd, size: pointSize)
        label.font = font
    }
}

zip(cell.distanceLabel.dynAttributedText, cell.distanceLabel) ->> bondFontSizeForIP6P

它有效,但很明显它无法涵盖所有​​条件,至少标签更频繁地更改带有字符串属性的文本。所以我认为如果有更通用的替代方法。我尝试使用协议来暗示领域文章中提到的泛型:Swift - Enums, Pattern Matching & Generics

protocol StringLike {}
extension String:StringLike{}
extension NSAttributedString:StringLike{}

我添加了此协议并更改了我的关闭bondFontSizeForIP6P

lazy var bondFontSizeForIP6P = Bond<(StringLike, UILabel)>{ (s, label) in
    if SRDevice.getVersion == .IPHONE6PLUS{
        let scaleFactor:CGFloat = 1.3
        let fd = label.font.fontDescriptor()
        let pointSize = fd.pointSize * scaleFactor
        let font = UIFont(descriptor: fd, size: pointSize)
        label.font = font
    }
}

并将此侦听器与两个观察者绑定。

zip(cell.distanceLabel.dynAttributedText, cell.distanceLabel) ->> bondFontSizeForIP6P
zip(cell.speedLabel.dynText, cell.speedLabel) ->> bondFontSizeForIP6P

显然,这不是一次成功的尝试,这就是我在这里的原因。错误日志在这里:

Binary operator '->>' cannot be applied to operands of type 'Dynamic<(NSAttributedString, UILabel!)>' and 'Bond<(StringLike, UILabel)>'

事实上,除了这个approche之外,我还尝试了另一种方法,比如将类型更改为更原始的类型,如Any,AnyObject Bond<Any>,但String不是AnyObject,NSAttributedString不是Any。

所以我的问题是,这意味着无法使用泛型类型来描述String和NSAttributedString,或者我没有意识到任何盲点?

0 个答案:

没有答案