问题标签 [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.
swift - 我可以从协议扩展的类型直接访问默认静态变量吗?
为了 Swift 的乐趣,我想我会为GCD
. 所以我把它扔进了操场:
但这会在最后一行产生错误:
我不确定这是在告诉我什么。我的意思是,我读过它。但我没有看到真正的问题。我查看了Double
var 之类的类型是如何使用的NaN
,但我不确定为什么我不能使用类似的访问器扩展另一种类型。
(我确实尝试过没有 的替代品typealias
,没有区别)
更新:@Kametrixom 的回答没有立即帮助,但它最终可能有所帮助。这是我必须做的才能让灯泡亮起来。
好的,这有效,现在是一个结构。
那也奏效了。现在是具有扩展默认实现的协议:
但是,使用协议扩展类或结构:
那行得通。我犯的错误(我认为?)是假设有一个 Humble 类型的第一类实例,它附有该行为,我可以调用它,ala 组合样式。相反,它只是添加到结构/类类型的行为模板。
我已经更改了问题的标题。答案是否定的。
swift - Add constraints to generic parameters in extension
I have this function:
As you can see, it transforms a [Key: Value?]
dictionary into a [Key: Value]
one (without the optional).
I wanted to extend the Dictionary
class with a new method only for classes which value is an Optional
of any type, but I am unable to add constraints to the generic parameters of the dictionary.
This is what I tried:
But fails with error:
objective-c - Cocoapods 框架中的 Swift 扩展导致无法识别的选择器发送到类
我有一个 Swift 框架,它通过 Cocoapods 进行管理,并包含如下扩展:
当我在我的主应用程序中用 Objective C 编写它时,我没有收到编译器错误或警告。
但是,当我运行该应用程序时,它会爆发出一堆“无法识别的选择器”错误。
奇怪的是,当框架包含在项目中并直接添加到构建阶段的相关部分(即不由 Cocoapods 管理)时,一切都按预期工作。
框架的其他方面——类、枚举等——也都可以正常工作,它似乎只是扩展并且只有当它们位于由 Cocoapods 管理的框架中时。
关于我可能在这里遗漏的任何想法?
swift - 两个不同模块中的相同类扩展
我的项目中有一个框架,它实现了 NSDate 的扩展。扩展看起来像这样。
我已将此框架导入到应用程序项目中。现在,如果我将相同的扩展名复制并粘贴到应用程序中的 swift 文件中,我的应用程序代码中的新副本似乎会覆盖框架代码中的副本。
当我在我的应用程序中调用这个函数时,有没有办法可以使用命名空间来指定我想要的实现?
ios - Self.Type 不能直接转换为 AnyClass 以扩展为 swift 中的objective-c 类
我正在尝试创建结构方法来创建具有正确 nib 名称的 UIViewController(以修复 iOS8 默认初始化程序问题)。为此,我添加了扩展名:
但是编译器发出错误:Cannot convert value of type 'Self.Type' to expected argument type 'AnyClass' (aka 'AnyObject.Type')
在NSStringFromClass(self)
.
要修复它,可以添加另一种扩展方法并将代码重写为:
但是我想了解第一个变体的问题。
据我了解,方法返回Self
是一种通用方法。Self
可以在许多上下文中使用(例如类、结构、协议等),但仅Self.Type
匹配AnyClass
类。
在我的情况下,编译器应该知道Self
引用UIViewController
及其所有子类(因为它在UIViewController
扩展内部),所以Self.Type
必须可以转换为AnyClass
.
我是否遗漏了什么,或者这是正确的行为,因为编译器不执行任何额外的类型分析Self
?
swift - 试图扩展 IntegerType(和 FloatingPointType);为什么不能将所有 Int 类型都转换为 NSTimeInterval
(这可能需要一个更好的标题......)
我想要一组可以在代码中使用的访问器来快速表达持续时间。例如:
这篇文章说明了你不能只用一个简单的新协议、扩展和强制来做到这一点IntegerType
并FloatingPointType
采用它。所以我想我会走更冗余的路线,直接扩展IntegerType
(然后重复代码FloatingPointType
)。
产生的错误令人困惑:
让我困惑的是,它似乎说我不能用 (Self) 做一个 NSTimeInterval() 初始化程序,但是 Self 表示的所有内容都列在下一行,它显示了 NSTimeInterval 的所有可能的初始化程序。我在这里想念什么?
旁白:如果有一篇写得很好的关于 Swift 类型系统和做这些事情的教程,我会很高兴的。Apple 稀疏的 Swift 文档没有很好地涵盖中级/高级的内容
更新/澄清:
我想要的是能够评估上述任何表达式:
此外,我希望这些的返回类型为 NSTimeInterval(Double 的类型别名),例如:
我知道我可以通过简单地扩展来实现这一点,Double
因此Int
:
但我也希望以下表达式起作用:
不过这行不通,因为我只扩展了Int
,而不是UInt
。我可以冗余地扩展Uint
,然后UInt16
,然后Int16
,等等......
我想概括 to 的扩展,Int
如IntegerType
原始清单所示,这样我就可以获得所有整数类型的一般转换。然后对FloatingPointType
而不是专门做同样的事情Double
。但是,这会产生原始错误。我想知道为什么我不能像通常所示的那样扩展 IntegerType。除了列表中显示的之外,是否还有其他IntegerType
采用者使得 NSTimeInterval() 初始化程序无法解析?
ios - UIView 的扩展
我的代码是用 Swift 2.0 编写的,部署目标是 iOS 8.0 或更高版本。我正在尝试扩展 UIView 以便UIView.animateWithDuration()
我可以使用我的自定义函数而不是使用。我想取一个UIView
圆形并保留它,使其角半径保持其高度和宽度的一半,但填充一个正方形。因此,UIView
应该以当前形状扩展,直到达到矩形边界。我想在 UIView 上使用扩展。如下。
有效的代码是。
swift - 协议扩展类型 Self 与初始值设定项类型不匹配
假设出于学术目的,我更喜欢这样的表达
而不是股票
由于所有各种 Swift 整数类型都符合IntegerType
协议并且因为似乎有一个Double()
初始化器适合所有类型的 int 类型,所以我想我可以这样:
这不起作用。我想知道为什么?我想知道是否有一些魔法可以使它起作用?一个where
也许?还是与self
参考有关?
我在此尝试的操场控制台中遇到的错误如下:
arrays - 带有选项的 Swift 数组扩展
我为 Array 创建了简单的扩展,它只会附加唯一的元素。在我想使用一系列选项之前,它工作正常。既然我不断收到错误
Type 'Event?' does not conform to protocol 'Equatable'
事件类
扩大
用法
问题
我不明白这种情况。Event
类符合该协议。我也尝试过添加其他==
功能组合,但没有成功。
我不知道如何看待这个问题。是我延期的问题吗?我应该如何正确处理它?你能告诉我正确的轨道吗?
swift - Swift:通用协议
我有一些 swift 结构,它们的协议合规性是通过具有相同方法名称的单个扩展生成的,这些扩展的返回类型不同,它们依赖于结构。最重要的是,我想在一个泛型函数中使用它们,该函数为泛型类型调用符合协议的函数)。我试图这样做: //: Playground - 名词:人们可以玩耍的地方
不幸的是,我收到以下错误:/var/folders/sn/78_zvfd15d74dzn01mdv258h0000gq/T/./lldb/3741/playground6.swift:7 :17:注意:协议需要函数 'createMe()' 类型为 ' () -> T ' (又名'<τ_1_0> () -> τ_1_0') 静态函数 createMe()->T;
这里到底有什么不符合的,是否有解决方法?