小编Geo*_* WS的帖子

Swift:在switch case中测试可选值

在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.添加?而不是!对我有意义(在可选链接的精神,我想),但不会使编译器错误消失(即实际上不打开可选的).

enums switch-statement optional swift

83
推荐指数
4
解决办法
3万
查看次数

在Swift中"钳制"两个值之间的数字的标准方法

鉴于:

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标准库.

可能没有,如果是的话,这也是我乐意接受的答案.:)

swift

49
推荐指数
8
解决办法
1万
查看次数

更改iOS模拟器保存的屏幕截图的位置

我想更改通过文件>保存屏幕截图在iOS模拟器中创建的屏幕截图的位置从桌面保存到我选择的文件夹.如何才能做到这一点?也许我可以更改用户默认值,就像在OS X上指定标准屏幕截图的位置一样?

screenshot simulator ios ios-simulator

19
推荐指数
3
解决办法
6205
查看次数

双指针作为Objective-C块参数

是否有可能(如果是这样,安全)创建/使用以双指针作为参数的块?

例如:

- (void)methodWithBlock:(void (^)(NSError **error))block;


其他背景,研究和问题:

  • 我正在使用ARC.
  • 当我声明上面的方法并尝试调用它时,XCode自动完成我的方法调用,如下所示:这里的意思是[self methodWithBlock:^(NSError *__autoreleasing *error) {}]; 什么__autoreleasing,为什么要添加它?我认为它与ARC有关.
  • 如果这可行且安全的,那么指针是否仍然可以在块中取消引用,就像在其他任何地方一样?
  • 一般来说,做我正在描述的内容和简单地将双指针作为方法参数(例如- (void)methodWithDoublePointer:(NSError **)error;)传递之间有什么重要区别?应该考虑哪些特殊考虑因素(再次假设这是可能的)?

objective-c objective-c-blocks

7
推荐指数
1
解决办法
1640
查看次数

在iOS上绘制扭曲的文本

使用iOS 9及更高版本中提供的标准API,如何在绘制文本时实现扭曲效果(如下图所示)?

扭曲的文字

我怎么想象这可能是有用的,通过指定基本上四个"路径段",可以是贝塞尔曲线或直线段(你通常可以在一个CGPath或多个中创建的任何单个"元素" UIBezierPath)定义文本的四个边缘的形状边界框.

此文本不需要是可选择的.它也可能是一个图像,但我希望找到一种在代码中绘制它的方法,因此我们不必为每个本地化都有单独的图像.我喜欢使用CoreGraphics,NSString/ NSAttributedString绘图添加,UIKit/TextKit甚至CoreText的答案.我只是决定在使用OpenGL或Metal之前使用图像,但这并不意味着我不会接受一个好的OpenGL或Metal答案,如果它实际上是唯一的方法.

core-graphics uikit ios

7
推荐指数
1
解决办法
590
查看次数

UICollectionViewController的布局所有权(self.collectionView.collectionViewLayout与self.collectionViewLayout)

我有一个UICollectionViewController管理集合视图,为不同的应用程序状态使用不同的布局.我正在使用-setCollectionViewLayout:animated:不同布局之间的转换.我遇到了错误的访问错误,并且非常有助于了解集合视图当前布局实际拥有的内容(例如,保留strong引用).

打完电话后-setCollectionViewLayout:animated:,我注意到以下(其中selfUICollectionViewController):

  • 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 …

objective-c uikit ios uicollectionview

6
推荐指数
1
解决办法
2026
查看次数

CoreText是已弃用的CGContext文本函数的替代品

在iOS 7中,不赞成使用几个CGContext文本绘图函数来支持Core Text:

不推荐使用的CGContext函数

Apple有时会建议使用已弃用的函数的特定替代方法(例如"使用x代替"),但在这种情况下,"x"只是"核心文本",并非完全具体.

所以,如果我只是在-drawRect:,我已经CGContextRef准备好了CGContextShowGlyphsAtPoint(),我准备打电话了,我该怎么做呢?什么是最佳实践,什么是最简单的核心文本替换,不需要重构除该调用之外的任何绘图代码(如果存在这样的事情)?

对于该页面上每个已弃用的文本函数,我们最简单地回答了这个问题的答案的奖励积分 - 我最感兴趣的是CGContextShowGlyphsAtPoint(),但这可以作为其他人寻求替代任何这些函数的良好参考.

core-graphics core-text ios ios7

6
推荐指数
1
解决办法
1623
查看次数

如何在Xcode 6调试器中查看Swift"let"的值

当我在Xcode 6中的调试器中停止时,如何查看用声明的局部Swift常量的值let

如果我在Xcode 6中创建一个全新的Swift项目,并application(_:didFinishLaunchingWithOptions:)在app delegate中添加以下两行:

let someConstant = 5
var someVariable = 6
Run Code Online (Sandbox Code Playgroud)

...然后运行应用程序并在这些行之后立即中断,这是我在调试器的变量视图中看到的:

变量视图的截图;  someVariable显示6,someConstant列出两次而没有显示其值

为什么变量显示其值,而常量不显示?(为什么常数列出两次?)

如果在LLDB控制台,我尝试p,pofr vsomeConstant(所有这些正确显示的值someVariable),我得到如下:

控制台截图;  p和po都导致

我知道我可以通过println在我的源代码中使用调试器中的值来打印,但是每次我只想检查一个我声明为的值时,我真的不需要有先见之明.不变.(即使是运行expr println(someConstant)在控制台LLDB产生相同的"未解决的识别符"误差ppo).

这应该很容易.我错过了什么?

lldb swift xcode6

6
推荐指数
1
解决办法
2856
查看次数

Swift 中的朋友类(访问内部类的私有成员)

我在两个不同的文件中有两个 Swift 类,它们都在同一个目标中。有没有办法让一个人访问另一个人的private成员而不将他们暴露为internalor public

(我本质上是在寻找类似于friendC++ 的东西。)


动机:

这对于UIViewControllerAnimatedTransitioning在单独的“转换”类中实现(通常需要源和目标视图控制器的深入了解)可能很有用,而不需要这些视图控制器将private子视图暴露给目标的其余部分。

access-modifiers swift

6
推荐指数
1
解决办法
3149
查看次数

展平CGPath

简单地说,我正在寻找-bezierPathByFlatteningPath可以在iOS上使用的NSBezierPath的等价物.对我来说,这是一个直接处理UGPezierPath上的CGPath或方法的函数并不重要,因为这两个函数可以很容易地来回转换.CGPath ReferenceUIBezierPath Class Reference都没有表明存在任何此类函数或方法.

另外:我知道CGPath的CGPathApply功能,我缺乏时间和技能来实现我自己的展平算法,通过遍历路径中的元素来实现CGPathApplierFunction.我正在寻找一个现有的解决方案 - 一个应用程序功能,一个关于UIBezierPath的类别,等等.当然存在一个.

core-graphics uikit ios

4
推荐指数
1
解决办法
1710
查看次数