这些之间有什么区别:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
Run Code Online (Sandbox Code Playgroud)
据我所知,两种情况都有相同的结果.编译代码有什么区别吗?
我已经阅读了@mattt的几篇教程,README,但无法弄清楚几件事.
URLRequestConvertible现实世界API 的正确用法是什么?看起来我是否会通过URLRequestConvertible为所有API 实现协议来创建一个路由器- 它几乎不可读.我应该每个端点创建一个路由器吗?
第二个问题很可能是由于缺乏使用Swift语言的经验造成的.我无法弄清楚为什么enum用于构建路由器?为什么我们不使用静态方法的类?这是一个例子(来自Alamofire的README)
enum Router: URLRequestConvertible {
static let baseURLString = "http://example.com"
static let perPage = 50
case Search(query: String, page: Int)
// MARK: URLRequestConvertible
var URLRequest: NSURLRequest {
let (path: String, parameters: [String: AnyObject]?) = {
switch self {
case .Search(let query, let page) where page > 1:
return ("/search", ["q": query, "offset": Router.perPage * page])
case .Search(let query, _):
return ("/search", ["q": query])
}
}()
let URL = NSURL(string: Router.baseURLString)! …Run Code Online (Sandbox Code Playgroud)我需要动画3个UIViews(淡入/淡出).1个动画持续时间为0.6秒(淡入/淡出周期为0.6 + 0.6秒).但我需要在0.2秒内启动动画.
并且所有这些都应该"无限期地"循环(直到某些触发).
我现在所拥有的:
- (void)playAnimation {
isAnimated = YES;
[self animateView:firstView afterDelay:0.0];
[self animateView:secondView afterDelay:0.2];
[self animateView:thirdView afterDelay:0.4];
}
- (void)stopAnimation {
isAnimated = NO;
}
- (void)animateView:(UIView *)animatedView afterDelay:(float)delay {
if(isAnimated) {
[UIView animateWithDuration:0.6 delay:delay options:UIViewAnimationOptionTransitionNone
animations:^ {
animatedView.alpha = 1.0;
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.6 animations:^ {
animatedView.alpha = 0.0;
} completion:^(BOOL finished) {
[self animateView:animatedView afterDelay:0.0];
}];
}];
}
}
Run Code Online (Sandbox Code Playgroud)
此代码无法预测.有时视图动画的工作方式与我想要的一样(相位为0.2秒),有时它会在同一时间开始......这样做的正确方法是什么?我也尝试afterDelay:从方法签名中删除部分并启动类似的效果:
[self performSelector:@selector(animateView:) withObject:thirdView afterDelay:0.6];
Run Code Online (Sandbox Code Playgroud)
更新
我注意到当重型网络设备在后台运行时(使用AFNetworking加载大图像)动画"中断".我不介意动画会"冻结"一点(虽然我更喜欢没有延迟)但我真的想保持所有动画的相位相关(相同的相位差).
为了使问题更容易理解,我添加了图表.Y是alpha,X是时间.前3个图 - …
我正在尝试使用属性类型Date之一保存托管对象managedObjectContext.
代码如下:
reminder.eventDate = selectedDate;
NSLog(@"Date: %@", selectedDate);
NSError *error = nil;
if (![reminder.managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Run Code Online (Sandbox Code Playgroud)
在上下文保存程序中使用SIGABRT崩溃.这是一个控制台日志:
2011-02-28 00:50:18.817 MyApp[9021:207] *** Terminating app due to uncaught
exception 'NSInvalidArgumentException', reason: '-[__NSDate isEqualToString:]:
unrecognized selector sent to instance 0x4e73490'
*** Call stack at first throw:
(
0 CoreFoundation 0x01057be9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x011ac5c2 objc_exception_throw + 47
2 CoreFoundation 0x010596fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x00fc9366 ___forwarding___ + 966 … 我有一些iOS开发经验(更多Java背景),最近我开始阅读"清洁代码".
我注意到在我的iOS项目中我有很多反模式.
2个最受欢迎的建议我没有正确遵循:小方法和小类.然后我对GitHub做了一些小研究,我找不到可以用作"清洁代码"的示例/参考的项目.
在大多数情况下,ViewControllers有数十种方法,并且它们具有巨大的方法,例如loadView我们以编程方式构建视图层次结构.
例如来自Facebook的示例应用程序wishlist-mobile-sample在HomeViewController类中有1431行代码,并且它loadView有170多行代码.
您是否有链接到您建议的项目作为一个非常好的编码示例?
我建立简单的主题引擎,并希望有一个扩展,它增加了UISwipeGestureRecognizer对UIViewController
这是我的代码:
protocol Themeable {
func themeDidUpdate(currentTheme: Theme) -> Void
}
extension Themeable where Self: UIViewController {
func switchCurrentTheme() {
Theme.switchTheme()
themeDidUpdate(Theme.currentTheme)
}
func addSwitchThemeGestureRecognizer() {
let gestureRecognizer = UISwipeGestureRecognizer(target: self, action:#selector(Self.switchCurrentTheme))
gestureRecognizer.direction = .Down
gestureRecognizer.numberOfTouchesRequired = 2
self.view.addGestureRecognizer(gestureRecognizer)
}
}
Run Code Online (Sandbox Code Playgroud)
当然编译器找不到,#selector(Self.switchCurrentTheme)因为它没有通过@objc指令公开.是否可以将此行为添加到我的扩展程序?
UPDATE: Theme是一个Swift枚举,所以我不能@objc在Themeable协议前添加
我已经完成了应用并准备将其提交给ap商店.在选择名字之前,我在美国,新加坡和爱尔兰的应用程序商店进行了搜索,但没有找到任何名称相同或相似的应用.所以我订购了logo,splashscreen,创建了网站,制作了截屏视频,注册了FB和Twitter账号.当然我到处都使用我的应用名称.想象一下,当iTunes Connect告诉我名字被采取时,我感到很惊讶!我搜索过网络,发现几年前有人发布了同名的游戏!游戏已经离开了应用商店,但名称仍然无法使用.我试图找到开发者的联系人,发现她的Facebook和Twitter.但看起来帐户已经没有被使用.我没有找到她的邮件......
你对我能做些什么有什么建议吗?我认为可能是iPad的AppName而不是AppName会保存情况.但后来我需要更改splashscreen,网站,FB和推特等.
谢谢!
在Chapter 2: Meaningful Names叔叔鲍勃写道:
不要添加无偿的上下文
在一个名为"Gas Station Deluxe"的想象应用程序中,为每个类添加前缀是个坏主意
GDS.坦率地说,你正在反对你的工具.您键入G并按下完成键,并获得系统中每个类的一英里长的列表
实际上,这是我在一年多前使用Objective-C的第一天发现的.在Java之后它非常令人失望,但我认为我只是一个对此感到恼火的人:)我明白,"清洁代码"一书大部分时间都指Java,而Java与Objective-C不同,它具有命名空间(包).
如果您正在构建应用程序而不是库,那么您是否在课程中使用了2-3个字母前缀?你觉得怎么样,语言设计不好,语言"功能"还是鲍勃叔叔不在这里?
我正在开发绘画应用程序.我试过用CoreGraphics/Quartz 2D和绘图曲线算法做的很慢.所以我们决定改用OpenGL ES.我从未有过任何OpenGL经验,所以我从苹果中找到了glPaint示例并开始玩它.
我改变了erase方法做白色背景.我如何坚持刷和混合.在示例中,Apple使用"白色黑色"纹理作为画笔(首先在下面的图片中).但它对我不起作用(我使用不同的混合模式).所以我决定使用不同的画笔,但我找不到合适的方法.我在stackoverflow上发现了一些问题,但是所有问题都没有得到答复.这是一张照片(来自另一个问题,感谢Kevin Beimers).
结果http://www.straandlooper.com/GLPaint.png
所以问题是如何在图片中实现类似"所需"的笔画.如何将2个笔画更接近现实生活体验(蓝色比黄色=深绿色).
谢谢.
刷子的当前代码(从glPaint修改的位)(来自initWithFrame方法:
// Make sure the image exists
if(brushImage) {
// Allocate memory needed for the bitmap context
brushData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
// Use the bitmatp creation function provided by the Core Graphics framework.
brushContext = CGBitmapContextCreate(brushData, width, width, 8, width * 4, CGImageGetColorSpace(brushImage), kCGImageAlphaPremultipliedLast);
// After you create the context, you can draw the image to the context.
CGContextDrawImage(brushContext, CGRectMake(0.0, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SwiftUI 重新创建我当前应用程序的 UI。而且这比我最初的难度要大得多。我想实现带有一些背景的卡片式单元格。我发现这List不支持,至少目前是这样。List是如此有限 - 它不允许您移除细胞分离器。
所以我搬到了ForEach里面ScrollView。我想这不应该用于长表的生产,但现在应该可以使用。我遇到的问题是ForeEach视图没有采用所有ScrollView提供的宽度。我可以设置.frame(...)修饰符,但这需要我绝对不想做的硬编码宽度。
任何想法如何强制VStack采用 ScrollView 的全宽?我试图使用ForeEach没有VStack与它有同样的问题。似乎ScrollView(父视图)“告诉”它的子视图(VStack)它的框架小于实际ScrollView的框架。并基于该信息子视图构建其布局和大小。
这是我目前的结果:

这是代码:
struct LandmarkList : View {
var body: some View {
NavigationView {
ScrollView() {
VStack {
Spacer().frame(height: 160)
ForEach(landmarkData) { landmark in
LandmarkRow(landmark: landmark).padding([.leading, .trailing], 16)
}
}.scaledToFill()
.background(Color.pink)
}
.background(Color.yellow)
.edgesIgnoringSafeArea(.all)
.navigationBarTitle(Text("Landmarks"))
}
}
}
struct LandmarkRow : View {
var landmark: Landmark …Run Code Online (Sandbox Code Playgroud)