问题标签 [swift-extensions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
10912 浏览

protocols - 在协议扩展中使用变异函数的 Swift 2 错误“不能在不可变值上使用变异成员:‘self’是不可变的

不知道这里发生了什么,这似乎应该很简单。我有一个可变 var 的协议,一个具有变异功能的扩展。testClass.testFunc中的事情正在崩溃,当我尝试使用扩展中声明的mtkAnimQueAppend时,我收到此错误:“不能在不可变值上使用变异成员:'self' 是不可变的。

0 投票
4 回答
1810 浏览

arrays - 扩展 Swift 数组以按类型过滤元素

如何扩展 swift 数组以访问特定类型的成员?

如果数组包含从同一个超类继承的多个类的实例,则这是相关的。理想情况下,它将适当地强制执行类型检查。


一些不太奏效的想法和事情:

使用该filter(_:)方法可以正常工作,但会强制执行类型安全。例如:

包含正确的filteredArray值,但类型仍然[MyProtocol]不是[TypeA]。我希望用替换最后一个let filteredArray = myStructs.filter({ $0 is TypeA }) as! [TypeA]可以解决这个问题,但是项目失败了EXEC_BAD_INSTRUCTION,我不明白。也许类型转换数组是不可能的?

理想情况下,这种行为可以包含在数组扩展中。以下内容无法编译:

这里似乎至少存在两个问题:类型约束T:Element似乎不起作用。我不确定添加基于泛型类型的约束的正确方法是什么。我的意思是说TElement. 此外,第 3 行存在编译时错误,但这可能只是相同的错误传播。

0 投票
1 回答
94 浏览

ios - 无法在受其他协议限制的泛型类型上调用协议方法

我有以下内容:

我希望将Guard协议分配给任意数量的不同类类型的对象,以及Prisoner其他对象。充当守卫的对象将根据它们的类类型有自己的 smack 实现。smackAll但我认为没有理由在每个可能继承的类中重新编写Guard. 所以我试图这样做,但编译器不允许我这样做。我错过了什么?

0 投票
1 回答
714 浏览

ios - Objective-C 中的 SlideMenuControllerSwift 实现

我尝试在 Objective-c中添加SlideMenuControllerSwift 。

我可以在我的 AppDelegate.m中访问[slideMenuController openLeft]

SlideMenuControllerSwift具有UIViewController 扩展。

但是如何在 obj-c ViewController.m 中访问 toggleLeft() ?

0 投票
4 回答
13888 浏览

swift - 在 Swift 中返回实例类型

我正在尝试进行此扩展:

但我得到编译错误:

错误:无法将“UIViewController”类型的返回表达式转换为“Self”类型

可能吗?我也想让它成为init(storyboardName: String, storyboardId: String)

0 投票
5 回答
8210 浏览

objective-c - Accessing Obj-C properties in Swift extension file

I started writing Swift extensions on my view controllers. So I have three files right now:

My header file, ViewController.h:

My Obj-C implementation file, ViewController.m:

And finally, ViewController.swift:

My question is, is it possible to access my Obj-C properties from my Swift implementation file? Every time I refer to it, I got an error:

Bonus 1: Can someone also clarify if the Swift component can see what the .m is a delegate of as well. (To clarify, doing scrollView.delegate = self in Swift is a compile error because the Swift file does not realise that the .m file is a UIScrollViewDelegate).

Bonus 2: Can Swift extension file call Obj-C methods that are declared from the .m counterpart?

0 投票
3 回答
615 浏览

arrays - Swift 字典数组扩展 sortInPlace

使用 Swift 2.1 我正在尝试创建一个函数,该函数按键 dateKey 的日期值对字典数组进行排序。

我想将此作为 Array 类型的扩展添加,所以我可以使用它来调用它someArray.sortDictionariesByDate(dateKey: String, dateFormatter: NSDateFormatter)

只要将字典键入为 ,这就可以正常工作[String: AnyObject],但是如果我在类型的字典上使用它,[String: String]它就不起作用,因为它无法转换StringAnyObject. 我认为这是因为Stringis a Structnot a Class。我也尝试将元素类型转换为[String: Any],但无论使用类型为[String: AnyObject]或的字典,它都不起作用[String: String]

是否有任何转换可以用来支持具有键类型String和任何值类型(StringAnyObject)的字典,或者可以添加到扩展中以避免完全转换的 where 子句或协议一致性?

编辑:这是根据请求的两个示例数组

0 投票
1 回答
586 浏览

swift - 未能实现符合类型的协议扩展

(随时酌情重命名问题)

我正在处理大量 BLE 数据,出于调试目的,我发现UInt8使用HEX计算变量进行扩展很容易:

我发现自己想要一个小写的变体。UInt32然后我也想要它UInt16。由于唯一改变的是要打印的位数,我认为我可以使用某种协议来做到这一点(至少出于教育目的)。

然后是我想利用这一点并提供HEXandhex方法的默认实现的部分:

我得到一个编译器错误Argument type 'Self' does not conform to expected type 'CVarArgType'

我想我明白这一点。也就是说,作为一个协议,它不能保证采用的类型是CVarArgType可以在 String 初始化器中使用的类型 ( ) 。所以我想我可以where第一次使用子句。我修改了我的协议扩展,如下所示:

这导致Same-type requirement makes generic parameter 'Self' non-generic. 在这一点上,我的业余类型理论家的理解溢出了。使我在不同 UInt 大小上的两种扩展方法起作用的魔力是什么?

0 投票
2 回答
817 浏览

swift - 如何将扩展中的字典解包为字典

我正在尝试将扩展中的字典解包为字典。但我遇到了一些问题,无法在任何地方找到答案。

我有一个获取字典的函数,在其中我想从 JSON 字典中获取一个 json 字符串,当然,如果它是一个有效的 JSON 对象:

但问题是我有一个var dict: Dictionary<String, AnyObject>.

我也尝试过使用StringLiteralConvertible

但后来我得到两个错误。我怎样才能让它工作?

0 投票
1 回答
1068 浏览

swift - 键盘扩展中的 UICollectionview

我试图将 UICollectionview 放入我的键盘扩展中,这是我快速制作的。但我无法让它工作。键盘只是在启动时崩溃。有人知道怎么修这个东西吗?或者甚至可以在键盘扩展中使用 UICollectionview。

类键盘视图控制器:UIInputViewController,UICollectionViewDelegateFlowLayout,UICollectionViewDataSource{

}