我在头文件中声明了一个CGFloat变量:
@property (nonatomic)CGFloat *heightOfSection;
Run Code Online (Sandbox Code Playgroud)
在我的实现文件上合成它,但它给我一个错误,试图为它分配一个值:
// Set height of section
heightOfSection = 45.0f;
Run Code Online (Sandbox Code Playgroud)
这是显示的错误:
Assigning to 'CGFloat *' (aka 'float *') from incompatible type 'float'
Run Code Online (Sandbox Code Playgroud)
有什么想法来解决这个问题吗?
显然CGFloat是double在arm64上:
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif
Run Code Online (Sandbox Code Playgroud)
所以代码
NSScanner *scanner = [NSScanner scannerWithString:string];
CGFloat c[components];
[scanner scanFloat:&c[i]]
Run Code Online (Sandbox Code Playgroud)
这对于32位应用程序来说效果很好,但是对于64位应用程序来说是破碎的.它可以替换为
NSScanner *scanner = [NSScanner scannerWithString:string];
CGFloat c[components];
#if CGFLOAT_IS_DOUBLE
[scanner scanDouble:&c[i]];
#else
[scanner scanFloat:&c[i]];
#endif
Run Code Online (Sandbox Code Playgroud)
但是有更好的选择吗?
我正在适应Swift一种我在互联网上找到的ObjectiveC方法(可能在这里,我记不起来了)当我为iPad Air构建它时,它运行得很完美,但当我尝试在iPad 2或iPad上运行时Retina它给出4个错误(2个不同的错误,每个错误两次):
/* Scale and crop image */
func imageByScalingAndCroppingForSize(#originalImage: UIImage, size:CGSize) -> UIImage {
let sourceImage = originalImage
var newImage: UIImage
let imageSize: CGSize = sourceImage.size
let width: Double = Double(imageSize.width)
let height: Double = Double(imageSize.height)
var targetWidth: Double = Double(size.width)
var targetHeight: Double = Double(size.height)
var scaleFactor: Double = 0.0
var scaledWidth: Double = targetWidth
var scaledHeight: Double = targetHeight
var thumbnailPoint: CGPoint = CGPointMake(0.0, 0.0)
if (imageSize != size) {
let widthFactor: Double = Double(targetWidth / …Run Code Online (Sandbox Code Playgroud) 我尝试在swift中做一些简单的UIView布局数学,并尝试了以下代码行...
var offset: CGFloat = (bounds.width / 2.0) - ((sortedSymptoms.count * bounds.height) / 2.0)
Run Code Online (Sandbox Code Playgroud)
并从编译器得到以下错误:
cannot invoke '-' with an argument list of type '(($T6), ($T17))'
var offset: CGFloat = (bounds.width / 2.0) - ((sortedSymptoms.count * bounds.height) / 2.0)
~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
编译器错误并没有那么有用,但看起来在某种类型的Double,Int和CGFloat之间存在类型冲突.我能够通过在CGFloats的一些明确创作中进行编译来获得编译,但我无法相信这是正确的方法.
var offset: CGFloat = (bounds.width / CGFloat(2.0)) - ((CGFloat(sortedSymptoms.count) * bounds.height) / CGFloat(2.0))
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法?
[我可能误解了整个主题,因为我已经成长为语言,允许开发人员几乎完全忽略处理器架构,如Java,除了在某些特定情况下.如果我有一些错误的概念,请纠正我.]
在这里阅读似乎建议使用CGFloat代替浮点数,因为它可以为我的代码提供面向未来的不同处理器体系结构(64位句柄浮动不同).假设这是正确的,那么为什么UISlider,例如,float直接使用(对于值)?对我来说,阅读它们float并将其转换为a CGFloat是不是错(或其他),因为无论如何,如果架构发生变化,我的代码是不正确的?
我试图在我的程序中递归添加一些CGFloat值.我刚刚在一个特定场景中意识到生成的总数是不正确的.为了确保我的程序逻辑没有任何问题,我创建了一个简单的场景示例(见下文),并打印出相同的错误值.
CGFloat arr[3] = {34484000,512085280,143011440};
CGFloat sum = 0.0;
sum = arr[0] + arr[1] + arr[2];
NSLog(@"%f",sum);
int arr1[3] = {34484000,512085280,143011440};
int sum1 = 0.0;
sum1 = arr1[0] + arr1[1] + arr1[2];
NSLog(@"%d",sum1);
Run Code Online (Sandbox Code Playgroud)
第一个NSLog打印689580736.000000 ...而正确的结果689580720.但是第二个NSLog打印正确的结果.我不确定这是一个错误还是我做错了什么.
谢谢,穆拉利
我有一个桌面视图,我在故事板中设计了多个原型单元格,但我遇到了高度问题,因为我的第一个单元格与第二个单元格不同,依此类推...我对每个单元格都有不同的标识符,因为我在故事板中设计它们,我知道它们的高度.我在我的代码中有这个,但它不起作用,有谁知道如何解决它?:
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc]init];
switch (indexPath.section)
{
case 1:
cell = [tableView dequeueReusableCellWithIdentifier:@"cell1"];
return 743.0f;
break;
case 2:
cell = [tableView dequeueReusableCellWithIdentifier:@"cell2"];
return 300.0f;
}
Run Code Online (Sandbox Code Playgroud)
}
谢谢你的时间.
我试图做这样的事情
var myCGFloat: CGFloat = 3.001
ceilf(myCGFloat)
Run Code Online (Sandbox Code Playgroud)
但ceilf只Float取值.在搜索时,有很多关于进行此转换的不同答案,或者取决于它是32位还是64位架构.
事实证明解决方案相当容易,但我花了太长时间才找到它.所以我写这个Q&A对作为其他人的捷径.
到目前为止,这不是一个问题,但从今天开始我遇到了一个不会一直发生的奇怪问题,但很少,我会说50次中有一次,甚至更少.
我正在比较两个CGFloat:s是这样的:
const CGFloat MYFIRSTFLOAT = /* get the first value */
const CGFloat THESECONDFLOAT = /* get the second value */
if (MYFIRSTFLOAT < THESECONDFLOAT) {
// do something
}
else {
// Do something else
}
Run Code Online (Sandbox Code Playgroud)
你可以看到我没有比较使用==或任何东西,因为它们是浮点数...(比如,它应该与比较浮点值的危险程度无关?现在应该如此)
而我遇到的问题是我遇到两个值完全匹配的情况,但比较评估为YES.在我的情况下,两个值都是"8926.5" - 这是我从LLDB获得的值.有没有一个很好的解释??? (我认为LLDB对这两个值进行四舍五入,这意味着它们可能真的是其他值 - 但为什么这也会在运行时发生呢?)
这种让我失望的原因我不能只看到问题......好吧,我正在考虑强制浮点数只用于这个比较,这次我可能没问题,但我觉得这个问题最好完全理解:-P
如何将@IValue CGFloat转换为Int?
我不断得到cannot convert @IValue CGFloat to Integer以下:
@IBOutlet var userObject : UIImageView
func returnYPosition(yPosition: Integer) -> Integer {
return userObject.center.y
}
Run Code Online (Sandbox Code Playgroud) cgfloat ×10
ios ×4
swift ×4
objective-c ×3
arm64 ×1
ceil ×1
cocoa-touch ×1
double ×1
height ×1
integer ×1
math ×1
nsscanner ×1
overloading ×1
uikit ×1
uitableview ×1
xcode ×1
xcode4 ×1