相关疑难解决方法(0)

在Swift中将CGFloat转换为NSNumber

我在Swift中有一个扩展,它包含了一些属性CGFloat.问题是我不知道如何使用关联对象获取存储的CGFloatNSNumber

这是我的代码不起作用,但它详细说明了我想做的事情:

var scaledFontSize: CGFloat {
    get {
        guard let fontSize = objc_getAssociatedObject(self, &AssociatedKeys.scaledFontSize) as? NSNumber else {
            //Set it
            let scaledFont:CGFloat = VGSizeValues.getValueFromValue(self.font.pointSize);
                //Fails here
            objc_setAssociatedObject(self,&AssociatedKeys.scaledFontSize, NSNumber( scaledFont),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return scaledFont;
        }
        return CGFloat(fontSize.doubleValue);

    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题?

casting nsnumber cgfloat ios swift

27
推荐指数
3
解决办法
1万
查看次数

NSNumber from CGFloat

Is there a safe way to "convert" a CGFloat to a NSNumber ?

NSNumber has the numberWithFloat: and numberWithDouble: methods but CGFloat being defined as float or double depending on the platform, it seems risky to use either one of them.

或者numberWithDouble:安全使用a CGFloat,因为它是更精确的?

floating-point objective-c nsnumber cgfloat

10
推荐指数
2
解决办法
1万
查看次数

如何将此值作为CGFloat获取?

我要求这样的价值:

[self.layer valueForKeyPath:@"transform.rotation.z"]
Run Code Online (Sandbox Code Playgroud)

我需要将它传递给一个以CGFloat为参数的方法.什么是铸造技巧?

iphone casting

5
推荐指数
1
解决办法
1万
查看次数

从NSNumber获得CGFloat最常见和最正确的做法是什么?

我的工作代码是这样的:

NSNumber *n = @42.42;
CGFloat cgf = 0; 
CFNumberRef cfn = CFBridgingRetain(n);
CFNumberGetValue(cfn, kCFNumberCGFloatType, &cgf);
CFRelease(cfn);
Run Code Online (Sandbox Code Playgroud)

也可能

CGFloat cgf = (CGFLOAT_IS_DOUBLE) ? [n doubleValue] : [n floatValue];
Run Code Online (Sandbox Code Playgroud)

但这对我来说更加丑陋.

在我看来应该有更好的API来做这样一个普通的事情.有吗?

cocoa-touch objective-c ios

5
推荐指数
1
解决办法
2930
查看次数

应该使用条件编译来应对不同体系结构中CGFloat的差异吗?

在回答之前关于使用ceil()CGFloat编译所有体系结构的问题时,我提出了一个解决方案:

    var x = CGFloat(0.5)

    var result: CGFloat

    #if arch(x86_64) || arch(arm64)
        result = ceil(x)
    #else
        result = ceilf(x)
    #endif

    // use result
Run Code Online (Sandbox Code Playgroud)

(对于那些已经混淆背景信息:CGFloat的是一个"浮动"型的32位体系结构,对于64位体系结构"双"(即编译的目标),这就是为什么只使用的任ceil()ceilf()上也不会总是编译,取决于目标体系结构.请注意,您似乎无法CGFLOAT_IS_DOUBLE用于条件编译,只有架构标志......)

现在,这引起了关于在编译时修复事物与运行时间的评论中的一些争论,等等.我认为,我的回答被接受得太快,无法吸引对此有关的一些好的辩论.

所以,我的新问题:如果你想让你的iOS和OS X代码在32位和64位设备上运行,上面是一个安全,明智的事情吗?如果它理智和明智的,还有更好的(至少是有效的,而不是"icky")解决方案吗?

swift

5
推荐指数
1
解决办法
938
查看次数