如何在Swift中创建私有函数?
这是一个例子:
import UIKit
class AnotherClass {
var someVar = 1
let someConst = 2
func somePrivateFunc() -> Bool {
return true
}
func someFunc() -> (Int -> Bool) {
var someInnerFuncVar = { (num: Int)->Bool in
return true
}
return someInnerFuncVar
}
init() {
var vc = ViewController()
}
}
Run Code Online (Sandbox Code Playgroud)
但如果这是唯一的方法....
我从调试器得到这条消息:
Pixture(1257,0xa0610500) malloc: *** error for object 0x21a8000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
所以我做了一些跟踪并得到了:
(gdb) shell malloc_history 1257 0x21a8000
ALLOC 0x2196a00-0x21a89ff [size=73728]: thread_a0610500 |start | main | UIApplicationMain | GSEventRun | GSEventRunModal | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopDoObservers | CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) | CA::Transaction::commit() | CA::Context::commit_transaction(CA::Transaction*) | CALayerDisplayIfNeeded | -[CALayer _display] | CABackingStoreUpdate | backing_callback(CGContext*, void*) | -[CALayer drawInContext:] | -[UIView(CALayerDelegate) drawLayer:inContext:] | -[AvatarView drawRect:] | -[AvatarView overlayPNG:] | +[UIImageUtility …
根据我到目前为止所学到的:在Objective-C中,您可以向任何对象发送任何消息.如果对象确实实现了正确的方法,那么它将被执行,否则不会发生任何事情.这是因为在发送消息之前,Objective-C将执行respondsToSelector.
我希望到目前为止我是对的.
我做了一个小程序来测试每次移动滑块时调用动作的位置.同样用于测试我将发送者设置为NSButton但实际上它是NSSlider.现在我问对象是否会响应setAlternateTitle.虽然NSButton会这样做而NSSlider不会.如果我运行代码并自己执行respondsToSelector,它会告诉我对象不会响应该选择器.如果我测试像intValue这样的东西,它会响应.所以到目前为止我的代码很好.
- (IBAction)sliderDidMove:(id)sender
{
NSButton *slider = sender;
BOOL responds =
[slider respondsToSelector:@selector(setAlternateTitle)];
if(responds == YES)
{
NSLog(@"YES");
}
else
{
NSLog(@"NO");
}
[slider setAlternateTitle:@"Hello World"];
}
Run Code Online (Sandbox Code Playgroud)
但是当我实际发送setAlternateTitle消息时,程序将崩溃,我不确定为什么.它不应该在发送消息之前执行respondsToSelector吗?
我们有一个iOS项目。Swift语言版本为4.2。我们以前是在Xcode 10.1中构建它的,没有编译错误。
更新到Xcode 10.2(但保留Swift 4.2)之后,该项目现在充满了诸如Invalid redeclaration of 'variable.storage'
(其中variable
的某些变量的名称)之类的错误。这些错误出现在私有的,用惰性方式初始化的变量旁边,这些变量的名称在整个项目中都是常用的,但不在其范围内重新声明;该错误似乎与storage
消息的一部分有关。清理并重建不能解决问题。有什么建议么?
编辑:这些错误只出现在两个类中。由于所有这些重新声明错误,我还错过了另一个合法的编译错误(Xcode 10.2中的新功能,但足够合法)。经过一番混乱**之后,我发现错误消失了。似乎是编译器中的错误。
**我的混乱步骤是(1)取消嵌套我遇到这些错误的第一个类,(2)创建一个与未编译的类具有相同内容的新类,并指向该类,(3)注释掉失败的类,(4)找到并修复了合法的编译错误。在这一点上,我不需要弄乱另一个也给出了重新声明错误的类。现在已编译代码。因此,(5)恢复了第一类。因此,这些重新声明错误可能只是误导了;如果您找到并修复了所有与迁移相关的错误,希望您不会看到其中任何一个。
有一个来自Apple的应用程序,它曾Jar Bundler
由Apple与Xcode分发.
目的Jar Bundler
是*.app
为Java应用程序创建Mac OS X应用程序包(目录),直到版本6(1.6.x)为Mac OS X用户提供便利.
截至目前,你仍然可以得到
又名
对于当前的Mac OS X Mountain Lion 10.8.2来说
但你无法得到Jar Bundler
.
我正在使用最新的Mac OS X 10.8.2和最新的Xcode 4.6(4H127),并安装了所有命令行工具.经过我所做的所有研究后,我希望它在这里:
/usr/share/java/Tools/Jar Bundler.app
Run Code Online (Sandbox Code Playgroud)
但没有Jar Bundler
.即使是全球搜索sudo find / -name Jar\ Bundler.app
也没有找到Jar Bundler
.
所以我的问题是:最后一个已知的Xcode版本是什么 Jar Bundler
注意:我知道还有其他方法可以实现Jar Bundler
此处的操作,例如使用Mac OS X JarBundler ANT Task或手动构建整个应用程序包,但这不是问题.
我正在尝试构建一个解析器/ objectMapper,它将为我从REST服务中使用的JSON构建Objective C对象.
我从RestKit中获得了一些灵感,让我的实体都拥有一个"解码列表",告诉映射器哪些JSON键与哪些对象一起使用.像这样:
//ObjectEntity implementation
+ (NSDictionary*) mapProperties {
/*
localPropertiy - JSONProperty
*/
return @{
@"name": @"name",
@"category": @"category",
@"possible_scopes": @"possibleScopes",
@"possible_descriptions": @"possibleDescriptions",
@"key": @"keys"
};
}
+ (NSDictionary*) mapRelations {
return [NSDictionary dictionary];
}
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我喜欢将这些可变值封装在它们引用的对象中.让Mapper知道尽可能少.
映射器执行以下操作:
+ (NSArray*) parseData:(NSData*) jsonData intoObjectsOfType:(Class) objectClass {
//Parser result from web service
NSError *error = nil;
CJSONDeserializer *deserializer = [CJSONDeserializer deserializer];
[deserializer setNullObject:nil];
NSArray *objects = [deserializer deserializeAsArray:jsonData error:&error];
NSMutableArray *result = [NSMutableArray array];
for (NSDictionary *o in objects) {
id …
Run Code Online (Sandbox Code Playgroud) 我正在转换编译并运行到Swift 3的Swift 2代码,我收到以下错误:
'Int1'不能转换为'Bool'
代码如下:
isUpdated = sharedInstance.database!.executeUpdate(
"UPDATE Coin_Table SET upgrade=?, grade=?, WHERE coin_id=?",
withArgumentsInArray: [
coinInfo.upgrade, (coinInfo.grade != nil) ? coinInfo.grade! : NSNull(),
coinID])
Run Code Online (Sandbox Code Playgroud)
上面的代码使用FMDB和FMDB.h中定义的方法
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;
Run Code Online (Sandbox Code Playgroud)
编译上面的代码时,它标记"(coinInfo.grade!="并给出错误.
我尝试简化它以查看它是否仍会发生:
let theArray: NSArray = [true ? "foo" : NSNull()]
Run Code Online (Sandbox Code Playgroud)
并且仍然得到相同的错误,这次它标记"真实".
我已经对此进行了大量搜索,并且除了https://bugs.swift.org/browse/SR-2372之外没有找到任何其他内容,但这是元组问题,我认为这不会影响我的码.
任何人都可以对此有所了解或建议一个解决方法,如果它是一个编译器错误?
谢谢
UV纹理坐标与ST纹理坐标之间有什么区别?
我知道在OpenGL中使用UV和ST.
我也知道ST也用在Java中.
我一直在研究这个问题,而且我似乎无法理解它已经足够解决它所以我认为我不妨把它扔出去并且聪明的一堆可能有一些想法.:P
基本上我一直在研究一个iPhone项目,我有幸使用所有最新的框架和目标5.1.所以我一直在使用GLKit和GLKBaseEffect,这对我来说一直很好.我开始使用GLKBaseEffect而不是编写自己的着色器的原因是我不太了解glsl.然而,要求变得更加精确,基本效果似乎不再削减它.
因为我已经使用基本效果进行了所有变换,所以如果我可以保持基本效果不变,但是如果有意义的话,可以在顶部添加glsl-type着色器.
我的旧方法看起来像这样(这是一个循环渲染所有对象,其中一个对象包含变换,网格和其他一些不太重要的东西,如纹理,材料等)
ObjectBase *obj = [ResourceManager.shared getObjectNamed:name inScene:sceneName];
GLKMatrix4 modelview = effect.transform.modelviewMatrix;
effect.transform.modelviewMatrix = GLKMatrix4Multiply(effect.transform.modelviewMatrix, obj.transform);
[effect prepareToDraw];
[obj render];
effect.transform.modelviewMatrix = modelView;
Run Code Online (Sandbox Code Playgroud)
在这里,我们获取一个对象来渲染和变换(即平移,旋转和缩放)对象,然后我们渲染它,渲染本身获取对象的网格,绑定缓冲区并渲染它.
到现在为止还挺好.
然而,我想要做的是,在[obj render];
调用期间,我希望对象也可以执行类似glUseProgram(someProgram);
添加更专业的着色器代码的操作.
我想有人可能会争辩说我正在尝试为我的顶点着色器使用基本效果,并希望为我的片段着色器使用"普通"着色器.至少那是我认为我想做的事情.
我一直在尝试一些事情.
我试图创建片段着色器并glUseProgram
在其上,但它说我在设置和编译时需要一个顶点和一个片段着色器.我也尝试创建一个空的顶点着色器,但结果并不好,我不知道会发生什么,但我猜它会否决基本效果.
最后,我倾向于接受它可能最好丢掉基本效果并且一直编写我自己的着色器.我觉得窗外有很多工作,所以我想知道我能节省多少钱.
我明白我对着色器的理解是给我带来最大问题的部分,所以请耐心等待.
应用程序在presentFrameBuffer中崩溃(在前台运行时,不会发生中断).
它没有在第一帧崩溃,它画了一段时间然后它突然崩溃了.
我没有重复的确切步骤,但似乎与绘制某些特定内容有关,但我仍然没有通过应用程序报告openGL错误,包括在presentFrameBuffer之前的一个错误检查.如果我在glFinish中将presentFrameBuffer崩溃之前添加glFinish.
应用程序崩溃与EXC_BAD_ACCESS(代码= 1,地址= 0x1)和上面的调用堆栈没有任何其他错误/日志/调试信息.
这是崩溃时报告的callstack:
线程1,队列:com.apple.main-thread
> #0 0x36871e46 in gpus_ReturnGuiltyForHardwareRestart ()
> #1 0x36872764 in gpusSubmitDataBuffers ()
> #2 0x31eae624 in SubmitPacketsIfAny ()
> #3 0x378a337a in gliPresentViewES ()
> #4 0x325b6df2 in -[EAGLContext presentRenderbuffer:] ()
> #5 0x0052986e in EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned int) ()
> #6 0x000e2a48 in -[EAGLView presentFramebuffer] at /svn/src_svn/GG/iphone/Classes/EAGLView.mm:228
> #7 0x000e4066 in -[GGViewController drawFrame] at /svn/src_svn/GG/iphone/Classes/GGViewController.mm:504
> #8 0x3809ab0a in __NSFireTimer ()
> #9 0x39d36856 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
> #10 0x39d36502 in …
Run Code Online (Sandbox Code Playgroud)