我有以下困惑.据我所知,在声明方法时静态和类关键字之间的主要区别在于第二个可以在子类中重写.
问题
但是,当我在Swift 1.2中声明一个协议时,如下所示:
protocol MyProtocol
{
class func dummyClassMethod()
}
Run Code Online (Sandbox Code Playgroud)
编译器给出错误:
类方法只允许在类中; 使用'static'来声明静态方法
这个错误非常具有描述性,因为很明显MyProtocol不是一个类,但是我想让一个类func成为协议的一部分.
我试过的
我发现如果我将协议中的接口声明为静态,编译器很高兴我可以在采用此协议的所有类中使用此静态方法:
protocol MyProtocol
{
static func dummyClassMethod()
}
Run Code Online (Sandbox Code Playgroud)
这个问题
所以我的问题基本上就是这样吗?这个声明声明我的类方法不能在子节点中重写,但是在我的实现中我可以编写并使用以下内容:
class ClassA: MyProtocol
{
class func dummyClassMethod() {
}
}
class ClassB: ClassA
{
override class func dummyClassMethod() {
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的dummyClassMethod不再是静态的......
编译器很好,一切正常 - 但为什么呢?
它是否特定于接口本身是静态的,但它的实现不是?
Objective-C解决方案
在ObjC中,这非常简单,编译和运行完美:
@protocol MyProtocol
+(void)dummyClassMethod;
@end
Run Code Online (Sandbox Code Playgroud) 我错过了什么或者Xcode 7应该仅在新的(测试版)OSX 10.11 El Capitan上运行吗?
我下载了测试版,经过一些代码更改以符合Swift 2.0后,我的项目编译并在OSX 10.10.3下运行正常.我错过了什么,或者Apple以某种方式改变了游戏?
我有一个项目,我最近添加了可可豆荚.我的项目使用通配符配置文件签署,直到今天我需要推送通知.我在开发人员控制台中创建并设置它,但是现在当我尝试在物理设备上运行它时AFNetwork(通过可可豆荚添加)失败并出现以下错误:
mkdir -p/Users/naxex/Library/Developer/Xcode/DerivedData/Profit-ezfzeesgjrasubavzqgwnexzgbsv/Build/Products/Debug-iphoneos/Bforex(QA).app/Frameworks rsync -av --filter - CVS/--filter - . svn/--filter - .git/--filter - .hg/--filter - Headers/--filter - PrivateHeaders/--filter - Modules// Users/naxex/Library/Developer/Xcode/DerivedData/Profit-ezfzeesgjrasubavzqgwnexzgbsv /Build/Products/Debug-iphoneos/Pods/AFNetworking.framework/Users/naxex/Library/Developer/Xcode/DerivedData/Profit-ezfzeesgjrasubavzqgwnexzgbsv/Build/Products/Debug-iphoneos/Test(QA).app/Frameworks building file list ...完成AFNetworking.framework/AFNetworking.framework/AFNetworking AFNetworking.framework/_CodeSignature/CodeResources
发送666427个字节收到70个字节1332994.00个字节/秒总大小是676284加速是1.01代码签名/用户/ naxex/Library/Developer/Xcode/DerivedData/Profit-ezfzeesgjrasubavzqgwnexzgbsv/Build/Products/Debug-iphoneos/Test(QA).app /Frameworks/AFNetworking.framework with Identity iPhone Developer:MY DEV(W8KV7Q7L6D)/ usr/bin/codesign --force --sign 29B75DC1CAE41505149FC025F4F2A8B57831E975 --preserve-metadata = identifier,entitlements/Users/naxex/Library/Developer/Xcode/DerivedData/Profit-ezfzeesgjrasubavzqgwnexzgbsv/Build/Products/Debug-iphoneos/Test(QA).app/Frameworks/AFNetworking.framework 29B75DC1CAE41505149FC025F4F2A8B57831E975:找不到身份命令/ bin/sh失败,退出代码为1
如果我切换回通配符配置文件应用程序在设备上运行正常.
有任何想法吗?
问候
嗨,我有一个很奇怪的问题.我的今日小工具在模拟器中运行得非常好,但是当我选择在真实设备上运行并选择"今天"应用程序时,xCode只是说"在XXX的iPhone上运行今天",但在该设备上没有小部件.我检查了"不包括"部分,它也不存在.
我搜索了很多,大多数人有三种类型的问题:

那么任何建议都会受到高度赞赏吗?我已经尝试过清理项目,将其从重启xCode的设备中移除...我正在使用xCode 6.2并试用iPhone 5(iOS 8.2)和iPhone 6+(8.2)
UPDATE
将设备更新到iOS 8.3因此xCode到6.3似乎解决了这个问题.但是我担心它是否适用于其他iOS 8.2设备.
解
由于@gaRik指出我的小部件部署目标设置为8.3,导致小部件在8.2设备上失败.
好的,这是一个大问题.我有一个用ObjC编写的库(这个).我们有一个定义的协议.当我试图在swift文件中使用它时,我不断得到:
类型"XXX"不符合协议"XXX"
为了简化我构建测试项目的事情 - 它应该被创建为Swift项目.
然后使用以下协议创建ObjC头文件(我称之为StupidProtocol.h)(请注意每个名称和值与给定的名称和值完全匹配,包括大写/小写):
@protocol MyProtocol <NSObject>
- (NSString *)getAxisLabel:(id)axis Value:(CGFloat)value;
@end
Run Code Online (Sandbox Code Playgroud)
在桥接标题中:
#import "StupidProtocol.h"
Run Code Online (Sandbox Code Playgroud)
然后回到Swift文件中:
class ViewController: UIViewController, MyProtocol
{
func getAxisLabel(axis: AnyObject!, value: CGFloat) -> String! {
return ""
}
}
Run Code Online (Sandbox Code Playgroud)
和baam我们再次得到这个错误,即使auto-complete为我完成了getAxisLabel函数.
我强烈怀疑问题是参数"value"和它的函数参数"Value".
任何帮助将受到高度赞赏.
编辑
请注意,这个库在技术上不是我的,所以我不能改变它.我需要一种方法在Swift中使用它而不改变它的原始声明.我的例子只是为了简化我的问题.
我做了什么
我尝试过以下方案但没有成功:
'具有与协议'错误所需的名称不同的参数名称
func getAxisLabel(axis: AnyObject!, Value value: CGFloat) -> String! {
return ""
}
Run Code Online (Sandbox Code Playgroud)
'具有与协议'错误所需的名称不同的参数名称
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> String! {
return ""
}
Run Code Online (Sandbox Code Playgroud)
'类型不符合协议'
func getAxisLabel(axis: AnyObject!, Value: CGFloat) -> NSString! { …Run Code Online (Sandbox Code Playgroud) 使用[NSMethodSignature getArgumentTypeAtIndex]函数时,我遇到了很奇怪的行为.根据objective-c 类型编码,它返回BOOL类型的'@'字符.如果我使用objc\runtime.h库方法method_getTypeEncoding BOOL类型被正确表示为'B',但是我不明白为什么它不能使用更高级别的层NSMethodSignature.以下代码演示了此问题:
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSInvocation* inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(viewDidAppear:)]];
const char* encFromGetArgument = [[inv methodSignature] getArgumentTypeAtIndex:2];
const char* encFromMethodSignature = method_getTypeEncoding(class_getInstanceMethod([self class], @selector(viewDidAppear:)));;
const char* methodEncodingPure = [[[[NSString stringWithUTF8String:encFromMethodSignature] componentsSeparatedByCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]] componentsJoinedByString:@""] UTF8String];//remove stack sizes
NSLog(@"BOOL arg from NSMethodSignature: %s", encFromGetArgument);
NSLog(@"BOOL arg from objc/runtime.h: %c", methodEncodingPure[3]);//first type is for return, second is target, third is selector
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是(至少对男性而言)打印出以下内容:
来自NSMethodSignature的BOOL arg:@
来自objc/runtime.h的BOOL arg:B
我目前正在使用我自己的实现来避免这种奇怪的行为,但我想知道我是否遗漏了某些东西或者它只是一个bug.我唯一的线索是BOOL是原始的,就像这样,在调用objective-c方法时不能直接使用它.但是,当我尝试检查它[object isKingOfClass:[NSNumber class]]时返回NO.
UPDATE
好的我已将XCode更新到最新版本(6.1 6A1052d),情况大大改善.但是我现在的问题是将unsigned char编码与real bool编码区分开来.我知道在旧版本BOOL是typedef作为char,但我怎么能完成真正的char vs BOOL编码?我现在的结果是:
对于 …
我正在尝试使用LRM以使字符串正确显示在阿拉伯语中.我的字符串如下:
百分比是:32.12%
然而在阿拉伯语上它显示为:
%32.12:نسبةط
到现在为止还挺好.在objective-c上我过去使用过以后的标记来解决这个问题:
[NSString stringWithFormat:@"\u200E %@", value]
Run Code Online (Sandbox Code Playgroud)
但是当我在Swift上尝试时,它只是没有移动百分比:
"\u{200E}\(value)"
Run Code Online (Sandbox Code Playgroud)
我在Swift中使用unicode字符是错误还是我在其他地方犯了错误?
我正在探索最新的Xcode Beta,在这样做的同时我正在观看一些相关的WWDC视频.根据这个(大约33分钟),您现在可以拥有一个快速代码生成宏(类似于Eclipse和AS).
我无法理解如何使用它.在此之后,我们有一个关于xcode扩展的讨论,所以它可能是一个扩展但是我不清楚 - 是否有可能在Xcode 8 beta中有这样的功能?
ios ×7
swift ×4
objective-c ×3
xcode ×3
protocols ×2
class-method ×1
cocoapods ×1
ios7 ×1
ios8 ×1
osx-yosemite ×1
swift2 ×1
swift3 ×1
unicode ×1
xcode7 ×1
xcode8 ×1