- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
XCode 6:测试版 5:
目标:
我正在尝试为语义兼容但不共享(或似乎共享)足够的协议(protocol)的类型编写泛型代码,以使我的泛型基于共享协议(protocol)的子集。到目前为止,我还没有找到解决方案,我想知道我是否遗漏了一些东西,或者它是否是语言的限制 - 任何见解都将受到赞赏。
问题:
我有一些函数只在类型上有所不同,在语义上没有区别,看起来很适合泛型。我遇到的问题是,据我所知,Swift 执行的似乎是泛型的解析时绑定(bind),如果可能存在问题则失败,而不是在实际存在问题时失败。
示例:
在人为的示例中考虑以下通用函数:
func defVal<T where T:FloatingPointType, T:FloatLiteralConvertible>(T.Type) -> T {
return 0.0
}
func defVal<T:IntegerLiteralConvertible>(T.Type) -> T {
return 0
}
请注意,我提供的函数应该跨越整数和 float 的情况,并且有意不想提供与我无关的所有可能变体的详尽列表。
然后我想定义跨类型的通用代码——在这个例子中,是 int 和 float 类型。请注意,即使没有任何调用它的代码,此代码也无法编译:
func doSomethingGeneric<T>(t:T) -> [T]
{
let a = defVal(T) // Type 'T' does not conform to protocol FloatLiteralConvertible
let b = a * a // works
return [t]
}
在我的内存中,这会在 C++ 中编译,直到您使用不兼容的类型调用它,此时编译器会捕获它。
我还尝试了其他效用降低的变体:
func doSomethingWithFloats<T
where T:FloatingPointType, T:FloatLiteralConvertible>(t:T) -> [T]
{
let a = defVal(T) // works
let b = a * a // T is not convertible to UInt8
// - need a floating point arithmetic type?
let c = -a // T is not convertible to Float
let f:Float = -a // T is not convertible to Float
return [t]
}
鉴于 Swift 提供协议(protocol)作为对具体实例(专用的,而非通用的)进行分组的一种方式,我编写了一个协议(protocol)集:
protocol Initializable {}
extension Float : Initializable {}
extension Double : Initializable {}
extension CGFloat : Initializable {}
func doSomethingWithInitializable<T:Initializable>(t:T) -> [T]
{
let a = defVal(T) // Type 'T' does not conform to protocol FloatLiteralConvertible
let b = a * a // works
return [t]
}
请注意,即使在所有 Initializable 类型的集合中实现了 FloatLiteralConvertible,这也会失败。换句话说,Swift 似乎过早地绑定(bind)了泛型类型,并且将泛型类型视为专门化的具体实例,而不是一个更大的模式,可以在链的更下方进行编译。此外,请注意,虽然我可以从 FloatLiteralConvertible 派生,但这会使我无法支持 int 类型等。如果有一个通用的 ArithmeticType 协议(protocol),可以想象它可以工作,但我没有看到任何类似的东西。这就是问题的症结所在 - 没有适用于两者的通用协议(protocol),即使 int 和 floating 类型在语义上是兼容的(具有相同的数学规则)。
总而言之,如何编写类型在语义上兼容但没有足够的跨越协议(protocol)来按协议(protocol)过滤的泛型函数(在这种情况下 - FloatingPointType 不实现 IntegerArithmeticType,但在语义上能够算术)。
提前致谢。
最佳答案
与 C++ 不同,Swift 不会通过在调用站点替换具体类型并制作非泛型副本来处理泛型(至少在一般情况下它不会 - 作为允许的优化,但我离题了)
Swift 通过在每次调用时将描述实际类型的元数据信息传递给一个主函数来处理通用性,然后主函数使用元数据提供的入口点来操作您的对象
在您的示例中,Initializable 不提供任何操作,因此当编译器尝试执行 defVal(T) 时,它不知道该做什么(它如何确保您的类型有 defVal 重载?)
你要做的实际上是在 Initializable 协议(protocol)上将 defVal 定义为静态函数,然后在扩展中实现它,然后 Swift 就会知道 T.defVal() 意味着类似于
metadata[Initializable]->defVal(metadata)
哦,因为你正在尝试执行 *(T,T),你可能还想制作一个可乘协议(protocol),然后你的 T 将被键入为
<T: protocol<Initializable,Multipliable>>
关于xcode - swift 泛型 : More specialized than generic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25275032/
我正在观看来自 iTunes U. 的视频讲座,其中讲师展示了如何使用 Xcode 的调试器部分并能够将该窗口从主窗口拉开。 不幸的是,视频显示了如何在 Xcode3 中执行此操作的说明。如何在 Xc
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
我真的厌倦了其他用户的项目错误,因为 XCode 的默认类引用类型是“相对于 XCode 文件夹”。我知道您可以将其更改为“相对于封闭组”,这就是我们的项目,但是任何时候有人创建一个新的类文件并且忘记
我对 Xcode 一无所知,除了它是来自 Apple 的开发人员界面,它实际上来自 OSX CD,它也用于创建 iPhone 应用程序。 我也知道它有一个 Applications 文件夹,里面装满了
更新 Xcode(从 7.2 到 7.2.1)后,XcodeServer 无法运行 Xcode Service。当我选择更新的 Xcode 时,提示消息:Enable Accessibility ac
我很难找到有关新 XCode 布局的信息。如何查看源文件的反汇编,而不仅仅是 C++ 代码? 最佳答案 在 Xcode 4.2(和 Xcode 5)中,您可以通过以下方式查看文件的汇编或反汇编: 显示
我在 XCode 中为我的项目添加了一个文件夹并将其命名为 Themes,它将用于存储我的 iPad 应用程序的主题。在那下面我有红色、蓝色等等。 它们出现在 XCode 中。但是当我查看物理文件夹时
作为我之前 How can I create a reference cycle using dispatchQueues? 的后续: 对于强引用(会造成泄漏,但不是循环引用),例如Timer、Dis
我有一台 macbook air,我去商店安装 Xcode 7.3 并点击更新 App 按钮,然后出现了一个加载图标,但等待 30 分钟后什么也没发生。我从商店成功安装了 simple recorde
我的项目现在有一个project.xcworkspace/xcshareddata目录。 Xcode在project.xcworkspace/xcshareddata目录中存储什么? 最佳答案 xcs
我不经常使用 XCode 进行开发,最近 MacPorts 告诉我我需要获得 3.1 才能使包工作。我去了苹果,他们为我提供了最新版本,结果只适用于 OSX 6。因为我有 OSX 5,它对我没有任何帮
有谁知道如何强制 Xcode 停止运行。我更新到 6.2 但现在它不能正常工作。我需要退出 Xcode 才能完成更新或卸载并重新安装。菜单中的相当 Xcode 不可用。无法将其拖到垃圾箱,因为它说它仍
我最近从我的项目中删除了一些旧的测试类并删除了文件。正如预期的那样,文件被移到垃圾箱并在 git 中显示为已删除。 不幸的是,测试类和它们定义的测试用例继续出现在测试导航器中。我已经尝试过常见的疑点,
Xcode 中的场景编辑器显示大小但不显示单位。它是以英寸为单位的尺寸还是以米为单位的尺寸? 例如,当我选择一个节点时,例如一个盒子,当我在节点检查器中检查它的属性并在“边界框”旁边的“变换”部分检查
只想知道 xcode 项目中事件可执行文件的目的是什么? 谢谢 索拉布 最佳答案 自己找到了..希望它会帮助某人。 您可以在其中运行和测试软件产品的可执行环境。可执行环境定义了应该用来运行产品的程序。
刚回到我的办公 table ,Xcode 一直在文件中突出显示/强调空白区域。如果我输入一些东西它就会消失,但如果我切换标签并回来,它们会重新出现。 更新:这不是由“显示隐形”选项引起的。那看起来不一
我首先注意到这一点 Cmd-/偶尔拒绝为注释取消注释的代码行工作。但是现在(刚刚使用 XCode 4.1,虽然这可能无关)它发生在 Cmd-B建立。 我无法弄清楚我正在做什么导致这种情况,或者是否有任
我不太了解Xcode 4的工作区的实用程序。它们的用途是什么,它们如何帮助Xcode进行开发? 最佳答案 例如。您有一个在两个应用程序中使用的库。您很可能为此库拥有一个自己的项目,对吗?现在,您可以自
我正在关注一个应用程序教程,它说: “接下来,在 Xcode 应用程序项目目录的根目录下创建一个空文件,并调用该文件 Podfile。使用您喜欢的文本编辑器打开它,然后在其中粘贴以下行:” 我很困惑这
我是一名优秀的程序员,十分优秀!