小编Ale*_*lex的帖子

Swift:检查泛型类型是否符合协议

我有一个我定义的协议:

protocol MyProtocol {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我也有一个通用的结构:

struct MyStruct <T>  {
    ...
}
Run Code Online (Sandbox Code Playgroud)

最后我有一个通用的功能:

func myFunc <T> (s: MyStruct<T>) -> T? {
   ...
}
Run Code Online (Sandbox Code Playgroud)

如果类型T符合MyProtocol,我想测试函数内部.基本上我希望能够做到(〜伪代码):

let conforms = T.self is MyProtocol
Run Code Online (Sandbox Code Playgroud)

但这会引发编译器错误:

error: cannot downcast from 'T.Type' to non-@objc protocol type 'MyProtocol'
   let conforms = T.self is MyProtocol
                  ~~~~~~ ^  ~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我也曾尝试变化,比如T.self is MyProtocol.self,T is MyProtocol以及使用==替代is.到目前为止,我还没有到任何地方.有任何想法吗?

generics swift

63
推荐指数
7
解决办法
5万
查看次数

Xcode 6 - 防止快速游乐场刷新

有时我在操场上写一些代码需要一段时间才能完成.例如:

var values = [[Int]](count: 10000, repeatedValue: [Int](count: 73, repeatedValue: 0))
Run Code Online (Sandbox Code Playgroud)

每当游乐场想要刷新结果时,它必须运行那段代码(需要一段时间才能运行)并且它使整个Xcode非常缓慢.

我仍然想在操场上编写我的代码,因为它有一些非常好的功能来测试你的算法.但是,我发现我必须对某些代码行进行注释才能继续编写而不会中断.

有没有办法对Xcode说:"现在不要跑我的操场.我会告诉你什么时候准备好了."?

xcode swift xcode6 swift-playground

28
推荐指数
2
解决办法
7040
查看次数

CALayer不透明度动画

我想创建一个CALayer动画,给人一种"华而不实"的效果.为此,我试图动画"不透明"属性,但我的问题是我不知道从哪里开始以及如何做到这一点.

以下是动画的图形说明:

opacity
   |    ___
1  |   |   |
   |   |   |    * repeatCount
0  |___|   |_ . . .
   -------------------------> time
    |______|
    duration
Run Code Online (Sandbox Code Playgroud)

不透明度从0开始,然后动画为1,然后再次为0(此0到1到0的动画需要等于持续时间的秒数).然后这个过程重复'repeatCount'次.

以下是代码的一些背景知识:

float duration = ...; // 0.2 secs, 1 sec, 3 secs, etc
int repeactCount = ...; // 1, 2, 5, 6, ect

CALayer* layer = ...; // I have a CALayer from another part of the code
layer.opacity = 0;

// Animation here

done = YES; // IN THE END of the animation set …
Run Code Online (Sandbox Code Playgroud)

core-animation objective-c opacity calayer

19
推荐指数
1
解决办法
2万
查看次数

Swift泛型:需要一种类型的加法和乘法能力

我正在尝试Swift书中的一些例子,即他们引入下标选项的矩阵示例.这是我的代码:

struct Matrix<T> {
    let rows: Int, columns: Int
    var grid: T[]

    var description: String {
        return "\(grid)"
    }

    init(rows: Int, columns: Int, initialValue: T) {
        self.rows = rows
        self.columns = columns
        grid = Array(count: rows * columns, repeatedValue: initialValue)
    }

    func indexIsValidForRow(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }

    subscript(row: Int, column: Int) -> T {
        get {
            assert(indexIsValidForRow(row, column: column), "Index out …
Run Code Online (Sandbox Code Playgroud)

swift

18
推荐指数
1
解决办法
4823
查看次数

Xcode 4目标构建设置"跳过安装".它是什么?

瓷砖基本上都说明了一切.

我正在开发一个具有正常应用目标的mac应用程序,但还有两个命令行工具目标,其产品在构建时被复制到应用程序.我记得在某些地方看到"跳过安装"在这些情况下很重要,但我记得我读过的东西都没有,所以这可能是不正确的.

无论如何,我只是想知道这个选项会有什么影响.

xcode build xcode4 xcode4.2

16
推荐指数
2
解决办法
8616
查看次数

NSUserDefaultsDidChangeNotification和Today Extensions

我正在开发一个带有Today Extension的iPhone应用程序.该应用程序有一个模型模块,可以加载/保存到NSUserDefaults.由于我希望主要应用和扩展程序都可以使用此信息,因此我使用了一个应用程序组:

let storage = NSUserDefaults(suiteName: "group.etc.etc.etc...")
Run Code Online (Sandbox Code Playgroud)

应用程序和扩展程序都可以毫无问题地访问信息.

主应用程序偶尔可能会创建一个本地通知以呈现给用户.该通知有两个与之关联的操作(UIUserNotificationAction).其中一个操作会触发一些代码在主应用程序的后台运行.该代码更改NSUserDefaults信息并触发同步.我的代码是这样的:

func application(application: UIApplication, handleActionWithIdentifier id: String?, forLocalNotification not: UILocalNotification, completionHandler: () -> ()) {
    // Interact with model here
    // New information gets saved to NSUserDefaults
    userDefaultsStorage.synchronize()
    completionHandler()
}
Run Code Online (Sandbox Code Playgroud)

现在,在今天外线.我自然会观察对信息所做的任何更改,NSUserDefaults以便我可以在窗口小部件上重新加载界面:

override func viewDidLoad() {
    super.viewDidLoad()

    // ...

    NSNotificationCenter.defaultCenter().addObserverForName(NSUserDefaultsDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
        self.reload()
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这是我的问题:

  1. 主应用程序安排UILocalNotification.我打开今天的视图,看看我今天的小部件.

  2. 当通知触发时,屏幕顶部会出现一个横幅.

  3. 我在那个横幅上向下滑动以显示这两个动作,然后我选择我之前提到的那个动作(今天的小部件仍在现场和屏幕上).

我知道这个动作在后台运行正常,并且正在对信息进行更改NSUserDefaults.

但是,即使今天的窗口小部件一直处于活动状态并始终显示在屏幕上,也不会触发重新加载操作.经过进一步调查,我可以证实,NSUserDefaultsDidChangeNotification …

nsuserdefaults ios swift ios8-today-widget today-extension

15
推荐指数
1
解决办法
5804
查看次数

NSBezierPath绘图

我想在NSImage上做一个圆角矩形轮廓,我想使用NSBezierPath是最好的方法.然而,我遇到了一个问题:我得到了这个:而不是绘制一条漂亮的曲线:

在此输入图像描述

由于我无法理解的原因,NSBezierPath正在绘制比其余部分颜色更深的圆角部分.

这是我正在使用的代码(在drawRect中:在自定义视图上调用):

NSBezierPath* bp = [NSBezierPath bezierPathWithRoundedRect: self.bounds xRadius: 5 yRadius: 5];
[[[NSColor blackColor] colorWithAlphaComponent: 0.5] setStroke];
[bp stroke];
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:

如果我将路径插入0.5,一切都很好.但是,当我将路径偏移10个像素(例如)时,为什么会得到这个?

在此输入图像描述

如果我理解正确的话,它也应该画一条细线......

cocoa drawing objective-c nsbezierpath

11
推荐指数
1
解决办法
3552
查看次数

从Today扩展中调度本地通知

我正在创建一个包含Today Extension的应用程序.今天的扩展显示计时器列表,如果用户选择其中一个计时器,我想为该计时器创建和安排本地通知.

我的问题是通过这行代码完成通知的安排:

UIApplication.sharedApplication().scheduleLocalNotification(notification)
Run Code Online (Sandbox Code Playgroud)

非常遗憾地依赖于UIApplication.sharedApplication()扩展无法访问的内容.

所以我的问题是:我如何在Today扩展中安排本地通知?

有趣的是,我可以使用我的应用程序和我的扩展程序之间共享的代码创建一个框架,在该框架中我可以调用:

func schedule() {
    // ...
    let settings = UIUserNotificationSettings(forTypes: .Sound | .Alert, categories: nil)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
    // ...
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果我然后从我的扩展中导入该框架并调用schedule()我得到此输出:

Failed to inherit CoreMedia permissions from 13636: (null)

Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7feaf3657a00>{fire date = Saturday, November 1, 2014 at 1:01:48 PM Western European Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Saturday, …
Run Code Online (Sandbox Code Playgroud)

notifications cocoa-touch ios uilocalnotification ios8-today-widget

11
推荐指数
3
解决办法
3311
查看次数

NSButton延迟NSMenu - Objective-C/Cocoa

我想创建一个NSButton在单击时发送动作的动作,但是当按下它1或2秒时它会显示一个NSMenu.这里的问题与这个问题完全相同,但由于答案没有解决我的问题,我决定再问一次.

例如,转到Finder,打开一个新窗口,浏览一些文件夹,然后单击后退按钮:您转到上一个文件夹.现在单击并按住后退按钮:显示一个菜单.我不知道如何做到这一点NSPopUpButton.

cocoa delay show nsmenu nsbutton

10
推荐指数
3
解决办法
2114
查看次数

Swift中的NSUserDefaults - 实现类型安全

关于Swift和Cocoa的问题之一就是使用NSUserDefaults,因为没有类型信息,并且总是需要将结果转换为objectForKey您期望获得的结果.这是不安全和不切实际的.我决定解决这个问题,让NSUserDefaults在Swift-land更加实用,并希望在此过程中学到一些东西.这是我一开始的目标:

  1. 完整的类型安全:每个键都有一个与之关联的类型.设置值时,只应接受该类型的值,并且在获取值时,结果应以正确的类型显示
  2. 全局密钥列表,其含义和内容清晰.该列表应易于创建,修改和扩展
  3. 清除语法,尽可能使用下标.例如,这将是完美的:

    3.1.set:UserDefaults [.MyKey] = value

    3.2.get:let value = UserDefaults [.MyKey]

  4. 通过自动[取消]归档来支持符合NSCoding协议的类

  5. 支持NSUserDefaults接受的所有属性列表类型

我开始创建这个通用结构:

struct UDKey <T>  {
    init(_ n: String) { name = n }
    let name: String
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了另一个结构,用作应用程序中所有键的容器:

struct UDKeys {}
Run Code Online (Sandbox Code Playgroud)

然后可以将其扩展为在需要的地方添加密钥:

extension UDKeys {
    static let MyKey1 = UDKey<Int>("MyKey1")
    static let MyKey2 = UDKey<[String]>("MyKey2")
}
Run Code Online (Sandbox Code Playgroud)

请注意每个键如何与其关联的类型.它表示要保存的信息的类型.此外,name属性是用作NSUserDefaults的键的字符串.

密钥可以在一个常量文件中列出,或者在每个文件的基础上使用扩展名添加,靠近它们用于存储数据的位置.

然后我创建了一个"UserDefaults"类,负责处理信息的获取/设置:

class UserDefaultsClass {
    let storage = NSUserDefaults.standardUserDefaults()
    init(storage: NSUserDefaults) { self.storage = storage }
    init() {}

    // ...
}

let UserDefaults = UserDefaultsClass() // …
Run Code Online (Sandbox Code Playgroud)

nsuserdefaults type-safety swift

10
推荐指数
1
解决办法
1815
查看次数