在Swift编码并得到上述错误......
消息掩盖其他东西还是你真的不能添加两个CGFloat操作数?如果没有,为什么(在地球上)不?
我正在尝试的代码没有什么特别之处; 有趣的是,上面的错误消息VERBATIM是Swift助手编译器告诉我的内容(用红色波浪线强调我的代码).
运行Xcode 6.3(Swift 1.2)
我有一个UILabel名为optionsDisplayerBrushSizeLabelwho的文本属性我想设置为CGFloat:brushSizeVal.我知道text属性需要是一个字符串,但我不知道如何将CGFloat转换为NSString.
我做了这个方法
+ (CGFloat) round: (CGFloat)f {
int a = f;
CGFloat b = a;
return b;
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作,但它只是向下舍入.如果它是一个负数,它仍然会向下舍入.
这只是我制作的一个快速方法,它正确地舍入并不是非常重要,我只是为了使我的游戏围绕相机的x和y值.
这个方法好吗?它快吗?或者有更好的解决方案吗?
var posinonY:Float = Float(y) + Float(pipeDown.size.height) + Float(verticalPipeGap)
pipeDown.position = CGPointMake(0.0, Float(posinonY))
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
"NSNumber"不是'CGFloat'的子类型"
为什么?
CGFLoat需要双重类型
pipeDown.position = CGPointMake(0.0, Double(posinonY))
Run Code Online (Sandbox Code Playgroud)
还行吧.
所以我正在开发一款简单的iPhone游戏,并试图制作一张本地高分榜.我想制作一个数组并将最高分数推入其中.以下是我到目前为止的代码:
CGFloat score;
score=delegate.score;
NSInteger currentindex=0;
for (CGFloat *oldscore in highscores)
{
if (score>oldscore)
{
[highscores insertObject:score atIndex:currentindex]
if ([highscores count]>10)
{
[highscores removeLastObject];
}
}
currentindex+=1;
}
Run Code Online (Sandbox Code Playgroud)
问题是highscores是一个NSMutableArray,它只能存储对象.所以这是我的问题,在阵列中存储CGFloats的最佳方法是什么?它们是支持CGFloats的不同类型的数组吗?将CGFloat变成对象是一种简单的方法吗?
并且请不要评论我在应用代表中存储分数这一事实,我知道这是一个坏主意,但我现在没心情必须制作一个单独的应用程序差不多完成了.
我在Swift中编写一个函数来检测我点击的六边形.但是我遇到了一个特殊的错误消息,指出我不能添加两个CGFloats.无论我做了,例如改变let到var,申报并分别分配,没有工作.我想一定有别的错误,但我找不到.代码如下:
func pointToCoordinate(position: CGPoint) -> (Int, Int) {
var gridHeight = 2 * singleRadius / sqrt(CGFloat(3)) * 1.5
var gridWidth = 2 * singleRadius
var halfWidth = singleRadius
var relativePosition = CGPoint(x: position.x - totalRadius / 2, y: position.y - totalRadius / 2)
println((relativePosition.y / gridHeight))
var row = -(cgfloatToInt)(relativePosition.y / gridHeight)
var column: Int
println((relativePosition.x + halfWidth * CGFloat(row + 1)) / (gridWidth))
column = cgfloatToInt((relativePosition.x + halfWidth * CGFloat(row + 1)) / (gridWidth))
// …Run Code Online (Sandbox Code Playgroud) 它甚至重要吗?Const之前还是const之后?我猜测我是const在CGFloat它之前还是之后使它的值CGFloat变为常量,但指针呢?这是否适合Objective-C:
// Example.h
extern CGFloat const kPasscodeInputBoxWidth;
// Example.m
CGFloat const kPasscodeInputBoxWidth = 61.0f;
Run Code Online (Sandbox Code Playgroud) 这可能是一个简单的解决方案,但我无法解决它.
我正在划分2个整数:
finishedGameFinalScore = [score integerValue];
CGFloat interval = 2/finishedGameFinalScore;
NSLog(@"interval = %f",interval);
Run Code Online (Sandbox Code Playgroud)
日志返回 0.000000
小数位有限制吗?我需要保留小数结果.
谢谢Shani
TLDR:如何在没有警告的情况下编译32位和64位CGFloats的方式调用标准浮点代码?
CGFloat定义为double或float,具体取决于编译器设置和平台.我正在尝试编写在两种情况下都能正常工作的代码,而不会产生很多警告.
当我使用floor,abs,ceil和其他简单浮点运算之类的函数时,我会收到关于值被截断的警告.例如:
警告:隐式转换将64位值缩短为32位值
我不关心计算的正确性或精度损失,因为我意识到我可以一直使用所有函数的双精度版本(floor而不是floorf等); 但是,我必须容忍这些错误.
有没有办法干净地编写支持32位和64位浮点数的代码,而不必使用大量的#ifdef __ LP64 __,或者为所有标准浮点函数编写包装函数?
考虑这样的布局代码:
CGFloat descriptionHeight = // height of a paragraph of text with zero or more words;
CGFloat imageHeight = // height of an image;
CGFloat yCoordinateOfSomeOtherView = fmax(descriptionHeight, imageHeight) + 5.0f;
Run Code Online (Sandbox Code Playgroud)
如何通过支持64位iOS设备来重写第三行?
(当前代码不考虑yCoordinateOfSomeOtherView是a float还是a double.)
一些选项(我不确定哪个是最好的):
#if defined(__LP64__) && __LP64__
#define cgfmax(x,y) fmaxf(x,y)
#else
#define cgfmax(x,y) fmax(x,y)
#endif
Run Code Online (Sandbox Code Playgroud)
然后我可以代替fmax使用cgfmax.
tgmath.h2011年的Stack Overflow回答建议替换math.h为tgmath.h.这取代了fmax一个调用__typeof__每个参数并返回fmax或者fmaxf根据参数类型返回的实现.
由于CGFloats与布局有关,因此将a存储 …
cgfloat ×10
objective-c ×6
ios ×3
swift ×3
iphone ×2
arrays ×1
c ×1
cocoa ×1
cocoa-touch ×1
const ×1
math ×1
nsstring ×1
properties ×1
text ×1
types ×1