如何在Swift中检查类型是否为Optional?
说我有一个PartialKeyPath类型的变量,其中:
struct Foo {
let bar: String
let baz: String?
}
typealias Property<Root> = (key: PartialKeyPath<Root>, value: Any?)
typealias Properties<Root> = [Property<Root>]
Run Code Online (Sandbox Code Playgroud)
现在说我遍历Properties的一个实例:
properties.forEach { prop in
let valueType1 = type(of: prop.key).valueType
let valueType2 = type(of: value)
...
Run Code Online (Sandbox Code Playgroud)
我如何在这里检查valueType1是否为Optional<valueType2>,或者它是否是其他可选样式的Optional?
到目前为止,我发现的唯一方法是非常丑陋的...
您知道在可访问性方面,用户可以将主页按钮设置为三击并使其成为"反色模式"吗?您的应用有没有办法检测手机是否处于逆色模式?谢谢.
在iOS 10中,我的应用程序的CloudKit功能不再起作用.完全相同的应用程序在iOS 9上工作正常.我尝试在XCode 8中构建它仍然无法正常工作.
不起作用的代码及其生成的错误如下所示.我们所做的是从公共云数据库中获取记录.我已经确认该设备上有一个新的iCloud帐户.同样的设备与iOS 9下的应用程序完美配合.我尝试重启设备并登录和退出iCloud,但仍然得到相同的错误.
请指教...
CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
CKRecordID *myRecordID = [[CKRecordID alloc] initWithRecordName:@"myRecord"];
[publicDatabase fetchRecordWithID:myRecordID completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {
if(error != nil) {
CLS_LOG(@"<ERROR> Error fetching record. Error: %@",error);
return;
}
//rest of code
}];
Run Code Online (Sandbox Code Playgroud)
结果是:
Error: <CKError 0x15e7c2b0: "Internal Error" (1/5001); "Couldn't get a
PCS object to unwrap encrypted data for field
encryptedPublicSharingKey: (null)">
Run Code Online (Sandbox Code Playgroud) 在XCode 8之前,您可以通过按字母顺序排列给定XCTestCase类中的测试方法的名称来使单元测试以特定顺序运行(如本答案中所述).例如,测试将运行如:testA,testB,testC,testD等.
但是在XCode 8中,情况已不再如此.例如,我将首先运行名为test1,test2,test3,test4和test4的测试方法(参见下面的屏幕截图).然后我可以重新运行,test2将在下一次运行时首先运行.
那么......如何在XCode 8上按顺序运行测试...?
我不确定这是iOS 7的bug还是什么.但是......我无法UIAccessibilityInvertColorsStatusDidChangeNotification上班.
所以,当我开始我的笔尖时,我这样做:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(inverted)
name:UIAccessibilityInvertColorsStatusDidChangeNotification
object:nil];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
稍后在我的代码中我收到了通知:
- (void)inverted {
if(UIAccessibilityIsInvertColorsEnabled()) {
NSLog(@"setting tintcolor to cyan");
self.view.tintColor = [UIColor cyanColor];
[self tintColorDidChange];
} else {
NSLog(@"setting tintcolor to red");
self.view.tintColor = [UIColor redColor];
[self tintColorDidChange];
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我的应用程序运行时,我通过主页按钮上的tripple-tap更改了反转颜色模式,应用程序中没有任何反应.不要在控制台上收到消息,不要改变tintColor,不要得到什么.
我在iOS 6和iOS 7上对此进行了测试.我尝试将我的构建目标设置为iOS 6.1而不是4.3,并且也没有修复它.
我尝试添加-(void)inverted;到我的界面,但没有解决它.我尝试在倒置后添加冒号,但也没有修复它,并且文档说这个通知无论如何都没有参数.
显然我做错了什么.什么?提前致谢.
鉴于:
struct Foo {
var bar: String = “”
var baz: Int? = nil
}
let values: [Any] = [“foo”, 1337]
let fooPaths: [PartialKeyPath<Foo>] = [\Foo.bar, \Foo.baz]
let protoFoo = Foo()
Run Code Online (Sandbox Code Playgroud)
如何创建迭代这些键路径和值的for循环,并在类型匹配两者且keypath是可写的时将值分配给键路径?
注意:它必须使用泛型来完成,因为Foo可以具有任何类型的属性(当然,除了类型Foo).
我尝试过这样的东西:
func setKeyOnRoot<Root, Value>(_ root: Root, value: Value, key: PartialKeyPath<Root>) -> Root {
var root = root
if let writableKey = key as? WritableKeyPath<Root, Value> {
root[keyPath: writableKey] = value
}
return root
}
Run Code Online (Sandbox Code Playgroud)
但由于在调用此函数之前必须将值转换为Any,因此运行时无法看到类型Value的含义.
我有一个像这样的对象:
foo = {"Foo Bar":"bar","Foo":"Bar"};
Run Code Online (Sandbox Code Playgroud)
在我的Jade模板中,我有:
p 1: {{foo.Foo Bar}}
p 2: {{foo.Foo}}
Run Code Online (Sandbox Code Playgroud)
问题是,输出是:
1: {{foo.Foo Bar}}
2: Bar
Run Code Online (Sandbox Code Playgroud)
但它应该是:
1: bar
2: Bar
Run Code Online (Sandbox Code Playgroud)
为什么会出现这个问题?我该如何解决?
在我的本地存储库中,我有一个文件模式为 550 的文件。在 .git/config 中,我的本地存储库和服务器存储库上都设置了 filemode=true。但是当我从 github 拉取文件时,文件总是显示为 775!
我对此感到非常困惑。有没有办法告诉 git 如何对文件进行权限?那么它不会像这样改变它们吗?我也很好奇,为什么 git 是这样设计的,不尊重文件权限?我意识到我可以制作一个 shell 脚本来修复它,等等,但我只是好奇。
抱歉,如果这是重复的,我找不到任何可以准确解决此问题的内容。
假设您在Java中有一个类和一个子类:
public abstract class Car {
public static Car getCar() {
Car car = makeCar();
return car;
}
private static Car makeCar() {
//bunch of code that makes the car
return car;
}
}
public class Ferrari extends Car {
private static makeCar() {
//bunch of code that makes a Ferrari! Yeah!
awesomeRide = new Car();
return awesomeRide;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在另一个课程中你打电话:
Ferrari.getCar();
Run Code Online (Sandbox Code Playgroud)
将调用法拉利的超类getCar()和 makeCar()方法.法拉利不能@Override getCar()因为在Java中,静态方法无法被覆盖.
所以在Car的getCar()方法中,如何判断方法调用是否发送到法拉利类,而不是类Car?既然这是一种静态方法,我if(this instanceOf Car)显然无法做到.
编辑:正确答案(下面)告诉我,由于有人调用Car.getCar()或Ferrari.getCar(),我确实无法从Car内部判断是否正在运行getCar().
但我不知道的是,根据Java的文档,虽然静态方法不能在Java中重写,但它可以被隐藏.
隐藏和重写之间的关键区别在于,隐藏时,静态方法会在同一个类上调用 …
为什么JSON没有关联数组?YAML.
你不能在JSON中这样做:
{
productsBySku: [
12J432: {
price: 49.99,
qty_in_stock: 4
},
5X4352: {
price: 29.99,
qty_in_stock: 5
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是在YAML你可以这样做:
productsBySku:
- 12J432:
price: 49.99,
qty_in_stock: 4
- 5X4352:
price: 29.99,
qty_in_stock: 5
Run Code Online (Sandbox Code Playgroud)
我在技术层面上想知道为什么这个决定可能是针对JSON做出的.
ios ×3
objective-c ×2
angularjs ×1
animated-gif ×1
arrays ×1
chmod ×1
class ×1
cloudkit ×1
generics ×1
git ×1
ios10 ×1
ios7 ×1
iphone ×1
java ×1
javascript ×1
json ×1
node.js ×1
optional ×1
permissions ×1
pug ×1
subclass ×1
swift ×1
swift4 ×1
unit-testing ×1
xcode ×1
xcode8 ×1
xctestcase ×1
yaml ×1