使用 Swift 推断类方法中的泛型类型

2024-02-11

泛型方法是否可以根据执行它的类来推断其类型?我使用 CoreData NSManagedObject 模型来存储和检索本地数据,并设法以一种易于阅读和可用的方式使所有内容通用,除了在一个地方。如果用户希望查询本地数据库以获取对象列表,他将编写以下行:

let posts: [Post] = Post.all()

这将正确返回数据库中的“所有”Post 对象,但语法要求定义类型([Post])在调用该方法之上Post类本身(Post.all()),感觉不必要地多余。有没有什么方法可以简单地通过调用来定义泛型类型all()方法从Post班级?我想我可以创建全局函数来获取数据,如下所示:

let posts: [Post] = all()

如果语法如下,则感觉不太可读:

let posts = Post.all()

尝试改进这一点的目的是让任何拿起这个项目的开发人员都可以快速学习其结构和风格,而不需要付出太多的努力。此外,这有望提高未来代码的总体可读性,无论有人正在处理它还是只是出于其他原因阅读它。

为了获得更多见解,以下是有关当前结构的更多信息:

//Model.swift - The model base class. All models extend this class.

class Model: NSManagedObject {
    /**
    Some other stuff here
    **/

    //MARK: Fetch
    internal class func fetch<T: Model>(predicate: NSPredicate? = nil) -> [T]? {
        do {
            if let request = NSFetchRequest.FromEntityName(self.entityName) { //Get entity with the name defined in the current class
                request.predicate = predicate
                if let result = try self.context?.executeFetchRequest(request) as? [T] {
                    return result
                }
            }
        }
        catch let error as NSError {
            Log.Error("\(error)")
        }
        return nil
    }

    //MARK: Fetch general
    class func all<T: Model>() -> [T]? {
        if let result: [T] = self.fetch() {
            return result
        }
        Log.warning("No \(self.entityName) found")
        return nil
    }
}

//Post.swift - An example model class. Extends Model.swift

class Post: Model {
    //some fields
}

//Example view controller
class ViewController: UIViewController {
    override func viewDidLoad() {
        let posts: [Post] = Post.all()
        //do stuff
    }
}

如果有人对此有任何想法,请告诉我。感谢所有帮助!


在一般情况下,类方法返回“类的类型”(即使对于子类)的典型方法是使用协议扩展和Self类型。下面是一个示例,它将您的方法简化为最低限度,以使类型检查按照您想要的方式工作:

// define a protocol
protocol ModelType {}
// create a static method on the protocol that returns [Self]
extension ModelType where Self: NSManagedObject {
    static func all() -> [Self]? {
        return [Self]() // do your fetch here
    }
}
// conform to the protocol in your class hierarchy
class Model: NSManagedObject, ModelType {}
class Post: Model {}

let posts = Post.all()
// implicit type of `posts` is `[Post]?`

注意all()应该由协议扩展提供,但是not协议的要求。如果你声明all() inside protocol ModelType,那么你不能让它使用动态分派,如果要使用动态类型,这是必需的。


另请注意,在 Swift 3(以及 macOS 10.12 / iOS 10 / tvOS 10 / watchOS 3)中,Core Data 本身定义了一些 Swift API 快捷方式,这些快捷方式替换了您自己定义的一些快捷方式。注意这个例子来自核心数据的新变化 https://developer.apple.com/library/content/releasenotes/General/WhatNewCoreData2016/ReleaseNotes.html#//apple_ref/doc/uid/TP40017342:

func findAnimals() {
    context.performAndWait({
        let request = Animal.fetchRequest // implicitly NSFetchRequest<Animal>
        do {
            let searchResults = try request.execute()
            // use searchResults ...
        } catch {
            print("Error with request: \(error)")
        }
    })
}

最后,对您选择的风格进行一些评论......

仅供参考,我将所有静态/类方法中的第一个字母大写,就像惯例一样

尝试改进这一点的目的是让任何拿起这个项目的开发人员都可以快速学习其结构和风格,而不需要付出太多的努力。此外,这有望提高未来代码的可读性

我不确定是否会违反语言标准约定(例如中推荐的小写方法名称)Swift 3 API 指南 https://swift.org/documentation/api-design-guidelines)与您的目标非常契合,即让其他刚接触您的代码库的开发人员能够轻松阅读和参与。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Swift 推断类方法中的泛型类型 的相关文章

  • 如何检测用户是否第一次打开应用程序[重复]

    这个问题在这里已经有答案了 是否可以检测用户是否是第一次打开iOS应用程序 使用Objective C 我想在用户第一次打开应用程序时显示欢迎消息 但之后不再向他们显示 我正在寻找类似的东西 BOOL firstTime AppDelega
  • 如何动态获取 UITableViewCell 的高度

    我创建了自定义的tableViewCell 我在UITableViewCell中添加了UIView SubView 所以我在 UIView 中的所有动态文本和图像内容都会根据文本和图像大小而变化 但现在 HeightforRowAtInde
  • 无法在 ios 应用程序中通过 googlecast 正确投射视频

    我正在开发一个基于 AVPlayer 的自定义视频播放器项目 尝试整合谷歌演员 我已经根据谷歌图进行了集成 https codelabs developers google com codelabs cast videos ios http
  • SwiftUI 意外地自动弹出 NavigationLink

    我有一个简单的用例 其中一个屏幕使用 NavigationLink 推送另一个屏幕 iOS 14 5 有一个奇怪的行为 即推送的屏幕在被推送后立即弹出 Code NavigationLink destination EmptyView Em
  • 如何为 iPhone 6+、6 和 5 指定不同尺寸?

    我想让 iPhone 6 6 和 5 上的视图看起来几乎相同 在附图中 我的意思是 例如 取消 按钮在 iPhone 5 中距离屏幕左边缘应为 30 像素 在 6 中为 35 像素 在 6 中为 45 像素 其他元素也类似 如何为每种类型设
  • Swift:设置协议的可选属性

    如何设置协议的可选属性 例如 UITextInputTraits 有许多可选的读 写属性 当我尝试以下操作时 出现编译错误 无法分配给 textInputTraits 中的 keyboardType func initializeTextI
  • 有没有办法在 Firebase 中等待查询完成?

    我正在使用 TableView 在 Viewcontroller 中的 iOS 应用程序中进行查询 我想确保在继续加载 TableView 之前我的查询已经返回 有没有办法保证查询已经完成 None
  • BigQuery 未显示链接的 Firebase Analytics 事件日志的任何数据集

    我将我的帐户链接到 Big Query 但 Firebase Analytics 事件不会自动加载到 BigQuery 中 显示 未找到数据集 警告 我的工作进度附在下面 请查收 I have getting firebase Analyt
  • Xamarin - 错误:dsymutil 退出,代码为 72

    最近升级到 VS for Mac 8 10 21 在构建应用程序时 我得到 Xamarin Shared targets 3 3 Error dsymutil exited with code 72 这是 Xcode 13 3 的情况 完整
  • jQuery:离线后 POST 出错(iOS 和 Chrome)

    我构建了一个具有离线功能的 HTML5 Web 应用程序 使用 AppCache 程序流程为 Online 在网络上时 应用程序预加载一些基本信息 工作 Offline 用户拿着装有应用程序的平板电脑offline 然后在应用程序上执行他们
  • 使用数组中的字符串淡入/淡出标签

    func setOverlayTitle self overlayLogo text Welcome var hello String Bon Jour GUTEN nMORGEN BONJOUR HOLA BUENOS D AS BUON
  • TObjectList.Contains 导致 Delphi 2009 中的访问冲突

    在 Delphi 2009 中 到目前为止 我在泛型方面没有遇到大问题 使用 Generics Collections 列表 没有特殊的泛型功能 现在我发现这段代码会在访问的行中导致AVMyList Contains 如果我声明 TMyLi
  • 如何删除 UITableView 中的缩进?

    首先 我对此很陌生 我很可能忘记了一些非常简单的事情 问题 我正在制作一个应用程序 在 a 中显示来自 imgur com 的随机图像tableView 由于某种原因 所有单元格都会缩进少量 如下图所示 我摆弄了许多设置storyboard
  • 在 WKWebView 中禁用缩放?

    有谁知道在 WKWebView 中禁用双击和捏缩放的简单方法 我尝试过的任何方法都不起作用 Webview scrollView allowsMagnification false Error value of type WKWebView
  • 关闭捕获上下文 Swift

    当我尝试更改闭包中的变量时出现此错误 A C function pointer cannot be formed from a closure that captures context 是否有解决方法或者仍然可以更改闭包内的变量 My C
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 所有 RestKit 项目在归档时都无法构建

    这个问题涉及RESTKIT 0 9 x 如果您是 Restkit 新手 请考虑使用较新的版本0 10 x https github com RestKit RestKit tree v0 10 1 branch 我最近继承了一个项目 使用r
  • UIViewController 内的 UIsearchController 使用自动布局

    有没有人成功实施过UIViewController其中包含两个UISearchController searchBar and a UItableView使用自动布局来布局所有内容 我正在尝试实现类似的目标1密码 https itunes
  • 如何在 UITableView 的 switch 语句中创建变量?

    我正在构建一个包含三个部分的 tableView 我已经完成了前两个工作 但最后一个有点阻力 我的问题似乎涉及尝试在 switch 语句中声明变量 实际上是嵌套的 switch 语句 据我所知 这不是一个好主意 但在这种情况下 这似乎是唯一
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 用“/”字符修补 kubernetes 标签

    我有以下代码 https stackoverflow com questions 57310483 whats the shortest way to add a label to a pod using the kubernetes go
  • 更改 Laravel 中的控制器模型模板

    我想知道是否有任何方法可以更改控制器和模型的基本模板laravel5 4 我的意思是当我跑步时 php artisan make controller ControllerName resource 它会生成这个
  • Matlab 中的布尔矩阵乘法

    Matlab 有布尔 有时称为逻辑或二进制 矩阵乘法函数吗 我具体讨论的是通常用带有点的圆圈表示的内容 以表示布尔矩阵乘法 cij ai1 b1j ai2 b2j ai3 b3j aik bkj 我很难找到一个 现在假设它不存在 如果是这种
  • 存储登录的用户详细信息

    创建 Web 应用程序时 假设您有一个表示单个用户的 User 对象 您认为存储用户已登录的最佳方式是什么 我考虑过的两种方法是 将用户数据库 ID 存储在会话变量中 将整个用户对象存储在会话变量中 有更好的建议吗 使用上述方法有什么问题吗
  • 大型 RSS 阅读器如何工作(netvibes、Google 阅读器...)

    我想知道像 Google Reader Logline technorati 这样的 Web 应用程序是如何工作的 以及它们遵循哪些技术使用 cron 作业一次性解析数百万个 RSS 提要 有一个lot不同的技术 最糟糕 的技术就是您所描述
  • jQuery 悬停动画多次触发

    我试图找出为什么我的悬停功能表现得很奇怪 当您将鼠标悬停在一个 div 上时 另一个 div 将变得可见 但是 当我将光标向下移动到可见的 div 时 它会淡出并再次淡入 这种情况不应该发生 并且应该保持可见 直到我的光标离开主容器 这是我
  • CSS问题Ngx-table angular2泳道

    我目前在获取 ngx datatable 以获得正确的 CSS 时遇到问题 我的 css 文件中有这个来导入正确的 css import swimlane ngx datatable release index css import swi
  • 如何比较 iOS 和 Android 中的加速度计值

    我在 iOS 中获取加速度计值如下 if motionManager accelerometerAvailable NSLog Accelerometer avaliable motionManager startAccelerometer
  • XPath - “not”和“!=”之间的区别

    只是一个简单的问题 关于以下内容中 xpath 的 not 和 之间的区别 获取 XML
  • “scales”选项似乎破坏了 Chart.js 图表

    我正在尝试使用 Chart js 在我的 django 项目中包含一些股票数据的折线图 我可以用我想要的数据渲染一个简单的图表 但是当我尝试格式化 x 轴的日期和时间时 图表不再渲染 这是该文件的工作版本 client small mark
  • 在 Javascript 中,给定值,从对象字面量中查找名称

    我是 JavaScript 新手 试图找到一种更简单的方法来查找给定对象文字值的名称 e g var cars Toyata Camry Prius Highlander Honda Accord Civic Pilot Nissan Al
  • 从用户硬盘浏览并选择文件在 IE 中给出未定义

    当我使用输入按钮浏览用户计算机上的文件时 它适用于 FF IE9 和 Chrome 但是当我将文件传递给 IE9 中的 JS 函数时 我得到了未定义的结果 而它在 FF 和 Chrome 中工作得很好
  • 枚举的详尽 switch 语句的静态分析[重复]

    这个问题在这里已经有答案了 考虑以下代码 enum MyEnum A B C int foo MyEnum e switch e case A return 1 case B return 2 case C return 3 error m
  • MPAndoid 图表具有以下样式

    我在我的项目中使用 MPAndroid Chart 我想将 LineChart 的样式设置如下 基本上我想要所有 4 个象限和其他样式 如渐变颜色等 首先通过这样做来填充线条后面的颜色 dataset setDrawFilled true
  • 如何从 STL 容器中获取仅移动类型?

    让我们考虑一个std unordered set of std unique ptr
  • 保存文件后自动启动单元测试

    借助 Ruby on Rails 当我保存代码文件时 我可以使用自动测试来自动运行所有测试 此外 该框架仅启动受更改影响的测试 并通知我测试结果 我使用Eclipse进行java开发有类似的情况吗 我不想要为我生成测试的东西 它只是应该在正
  • 使用 PHP 检索文本区域的值

    有人可能知道如何使用 PHP 获取 HTML 文档中特定元素的值吗 我现在正在做的是使用file get contents从另一个网站提取 HTML 代码 该网站上有一个文本区域
  • 关闭模态并滚动到 div

    contact form click function html body animate scrollTop contact section offset top 2000 div class modal fade div class m
  • 在 ImageButton 中动态更改图像

    XML
  • 使用 Swift 推断类方法中的泛型类型

    泛型方法是否可以根据执行它的类来推断其类型 我使用 CoreData NSManagedObject 模型来存储和检索本地数据 并设法以一种易于阅读和可用的方式使所有内容通用 除了在一个地方 如果用户希望查询本地数据库以获取对象列表 他将编