如何使Swift的String类型符合CVarArgType协议?

5

Swift协议定义为空:

public protocol CVarArgType {
}

苹果文档页面没有列出任何必需的方法: https://developer.apple.com/library/ios/documentation/Swift/Reference/Swift_CVarArgType_Protocol/index.html 因此,我认为这应该可以工作:
extension String : CVarArgType {

}

但是我遇到了一个构建错误:协议要求具有类型为 '[Int]'(Swift.CVarArgType)的'_cVarArgEncoding'属性

鉴于协议定义为空,这个要求从哪里来?

如果我实现计算属性,将会如何继续前进:

extension String : CVarArgType {
    public var _cVarArgEncoding: [Int] {
        get {
            //What is expected to be returned here?
        }
    }
}

预期返回一个 Int 数组?

更新:我为什么需要这个?

我有一个名为 Identifiable 的协议,我的 Core Data 实体模型类符合该协议,我有一个对该协议的扩展,其中包含一些限制条件,以提供一个使用 id 值在 NSPredicate 中格式化构造函数中的函数,该函数需要 CVarArgType。

public protocol Identifiable {
    typealias IdentityType: CVarArgType, Hashable
    var id: IdentityType { get }
}

extension Identifiable where Self: Findable, Self: NSManagedObject {

    static public func find(id: IdentityType, context: NSManagedObjectContext) -> Self? {
        return find(NSPredicate(format: "id = %@", id), context: context)
    }

}

public extension Findable where Self: NSManagedObject {

    static public func find(predicate: NSPredicate?, context: NSManagedObjectContext) throws -> Self? {
        let fetchRequest = fetchRequestForEntity(inContext: context)
        fetchRequest.predicate = predicate
        fetchRequest.fetchLimit = 1
        return try context.executeFetchRequest(fetchRequest).first as? Self
    }

}

我认为这个问题的实际价值很小,有更好的方法来处理 va_list 参数。然而,我认为这个问题仍然有一些优点,因为它探索了ObjectiveC-Swift集成的边缘。编码可以指 ObjectiveC类型编码。如果您能解释您想要做什么,我们可以提供更多帮助。 - Code Different
@CodeDifferent 我已经更新了问题,提供更多的背景信息。 - sja26
你能否不使用NSPredicate的arrayArgument init方法吗?- init(format predicateFormat: String, argumentArray arguments: [AnyObject]?) - Joseph Lord
我遇到了一个构建错误:“Self.IdentityType的值不符合预期的元素类型'AnyObject'”。 - sja26
你的协议没有继承自NSObjectProtocol,应该修复这个问题。结构体和枚举可能与NSPredicate不兼容。实际上,在这个扩展中,你可以将它强制转换为AnyObject,因为它是一个NSManagedObject。 - Joseph Lord
1个回答

5
我认为你不应该试图将其他类型转换为它们。Swift源代码 表示:
注意:协议是公共的,但其要求是stdlib-private。这是因为有一些API操作CVarArg实例,但在标准库之外定义符合CVarArg的内容是不支持的。
stdlib 在很多方面都是特殊的,并且比用户代码更深入地插入了构建系统。其中一个例子是许多stdlib函数可以内联到您自己的代码中,而在其他情况下跨模块边界目前是不可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接