在Swift中,如何在switch语句中编写一个case来测试根据可选内容切换的值,如果可选包含,则跳过case nil?
以下是我的想象:
let someValue = 5
let someOptional: Int? = nil
switch someValue {
case someOptional:
// someOptional is non-nil, and someValue equals the unwrapped contents of someOptional
default:
// either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional
}
Run Code Online (Sandbox Code Playgroud)
如果我只是这样编写它,编译器抱怨someOptional没有解开,但如果我通过添加!到结尾显式解包,我当然会在任何时候someOptional包含运行时错误nil.添加?而不是!对我有意义(在可选链接的精神,我想),但不会使编译器错误消失(即实际上不打开可选的).
鉴于:
let a = 4.2
let b = -1.3
let c = 6.4
Run Code Online (Sandbox Code Playgroud)
我想知道将这些值限制在给定范围内的最简单,最快捷的方法0...5,例如:
a -> 4.2
b -> 0
c -> 5
Run Code Online (Sandbox Code Playgroud)
我知道我可以做到以下几点:
let clamped = min(max(a, 0), 5)
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
let clamped = (a < 0) ? 0 : ((a > 5) ? 5 : a)
Run Code Online (Sandbox Code Playgroud)
但是我想知道在Swift中是否有其他方法可以做到这一点 - 特别是我想知道(并且在SO上记录,因为似乎没有关于在Swift中钳位数字的问题)是否有任何内容专门为此目的而设计的Swift标准库.
可能没有,如果是的话,这也是我乐意接受的答案.:)
我想更改通过文件>保存屏幕截图在iOS模拟器中创建的屏幕截图的位置从桌面保存到我选择的文件夹.如何才能做到这一点?也许我可以更改用户默认值,就像在OS X上指定标准屏幕截图的位置一样?
是否有可能(如果是这样,安全)创建/使用以双指针作为参数的块?
例如:
- (void)methodWithBlock:(void (^)(NSError **error))block;
其他背景,研究和问题:
[self methodWithBlock:^(NSError *__autoreleasing *error) {}];
什么__autoreleasing,为什么要添加它?我认为它与ARC有关.- (void)methodWithDoublePointer:(NSError **)error;)传递之间有什么重要区别?应该考虑哪些特殊考虑因素(再次假设这是可能的)?使用iOS 9及更高版本中提供的标准API,如何在绘制文本时实现扭曲效果(如下图所示)?

我怎么想象这可能是有用的,通过指定基本上四个"路径段",可以是贝塞尔曲线或直线段(你通常可以在一个CGPath或多个中创建的任何单个"元素" UIBezierPath)定义文本的四个边缘的形状边界框.
此文本不需要是可选择的.它也可能是一个图像,但我希望找到一种在代码中绘制它的方法,因此我们不必为每个本地化都有单独的图像.我喜欢使用CoreGraphics,NSString/ NSAttributedString绘图添加,UIKit/TextKit甚至CoreText的答案.我只是决定在使用OpenGL或Metal之前使用图像,但这并不意味着我不会接受一个好的OpenGL或Metal答案,如果它实际上是唯一的方法.
我有一个UICollectionViewController管理集合视图,为不同的应用程序状态使用不同的布局.我正在使用-setCollectionViewLayout:animated:不同布局之间的转换.我遇到了错误的访问错误,并且非常有助于了解集合视图当前布局实际拥有的内容(例如,保留strong引用).
打完电话后-setCollectionViewLayout:animated:,我注意到以下(其中self为UICollectionViewController):
self.collectionView.collectionViewLayout 返回新布局.self.collectionViewLayout 仍然返回旧布局.这导致我检查UICollectionView类参考,它解释了这种行为:
collectionViewLayout
用于初始化集合视图控制器的布局对象.(只读)
@property (nonatomic,readonly) UICollectionViewLayout *collectionViewLayout讨论
此属性包含传递给initWithCollectionViewLayout:方法的布局对象.此属性中的布局对象未更新以反映对集合视图本身的更改.您可以使用此属性来引用最初配置要使用的集合视图的布局对象.
好的.那么self.collectionViewLayout初始布局的弱引用(或者是?)self.collectionView.collectionViewLayout是对当前布局的强引用.
To confirm this, I took a dive into the debugger, but wasn't able to find the actual UICollectionView supposedly owned by the UICollectionViewController. Instead, the collection view controller's _view variable was an instance of UICollectionViewControllerWrapperView. Whaaaat?
This whole experience left me with …
在iOS 7中,不赞成使用几个CGContext文本绘图函数来支持Core Text:
Apple有时会建议使用已弃用的函数的特定替代方法(例如"使用x代替"),但在这种情况下,"x"只是"核心文本",并非完全具体.
所以,如果我只是在-drawRect:,我已经CGContextRef准备好了CGContextShowGlyphsAtPoint(),我准备打电话了,我该怎么做呢?什么是最佳实践,什么是最简单的核心文本替换,不需要重构除该调用之外的任何绘图代码(如果存在这样的事情)?
对于该页面上每个已弃用的文本函数,我们最简单地回答了这个问题的答案的奖励积分 - 我最感兴趣的是CGContextShowGlyphsAtPoint(),但这可以作为其他人寻求替代任何这些函数的良好参考.
当我在Xcode 6中的调试器中停止时,如何查看用声明的局部Swift常量的值let?
如果我在Xcode 6中创建一个全新的Swift项目,并application(_:didFinishLaunchingWithOptions:)在app delegate中添加以下两行:
let someConstant = 5
var someVariable = 6
Run Code Online (Sandbox Code Playgroud)
...然后运行应用程序并在这些行之后立即中断,这是我在调试器的变量视图中看到的:

为什么变量显示其值,而常量不显示?(为什么常数列出两次?)
如果在LLDB控制台,我尝试p,po或fr v上someConstant(所有这些正确显示的值someVariable),我得到如下:

我知道我可以通过println在我的源代码中使用调试器中的值来打印,但是每次我只想检查一个我声明为的值时,我真的不需要有先见之明.不变.(即使是运行expr println(someConstant)在控制台LLDB产生相同的"未解决的识别符"误差p和po).
这应该很容易.我错过了什么?
我在两个不同的文件中有两个 Swift 类,它们都在同一个目标中。有没有办法让一个人访问另一个人的private成员而不将他们暴露为internalor public?
(我本质上是在寻找类似于friendC++ 的东西。)
动机:
这对于UIViewControllerAnimatedTransitioning在单独的“转换”类中实现(通常需要源和目标视图控制器的深入了解)可能很有用,而不需要这些视图控制器将private子视图暴露给目标的其余部分。
简单地说,我正在寻找-bezierPathByFlatteningPath可以在iOS上使用的NSBezierPath的等价物.对我来说,这是一个直接处理UGPezierPath上的CGPath或方法的函数并不重要,因为这两个函数可以很容易地来回转换.CGPath Reference和UIBezierPath Class Reference都没有表明存在任何此类函数或方法.
另外:我知道CGPath的CGPathApply功能,我缺乏时间和技能来实现我自己的展平算法,通过遍历路径中的元素来实现CGPathApplierFunction.我正在寻找一个现有的解决方案 - 一个应用程序功能,一个关于UIBezierPath的类别,等等.当然存在一个.