我怎样才能使Swift';s字符串类型是否符合CVarArgType协议?
Swift协议定义为空:我怎样才能使Swift';s字符串类型是否符合CVarArgType协议?,swift,Swift,Swift协议定义为空: public protocol CVarArgType { } Apple文档页面没有列出任何必需的方法: 所以我希望这能奏效: extension String : CVarArgType { } 但是我得到了一个生成错误:协议需要属性“\u cvargencode”和类型“[Int]”(Swift.CVarArgType) 鉴于协议定义为空,此要求从何而来 如果我实现computed属性,请继续: extension String : CVarArgType
public protocol CVarArgType {
}
Apple文档页面没有列出任何必需的方法:
所以我希望这能奏效:
extension String : CVarArgType {
}
但是我得到了一个生成错误:协议需要属性“\u cvargencode”和类型“[Int]”(Swift.CVarArgType)
鉴于协议定义为空,此要求从何而来
如果我实现computed属性,请继续:
extension String : CVarArgType {
public var _cVarArgEncoding: [Int] {
get {
//What is expected to be returned here?
}
}
}
希望以Int
数组的形式返回什么
更新:我为什么需要这个?
我有一个名为Identification的协议,我的核心数据实体模型类符合该协议,我有一个对此协议的扩展,带有几个约束,以提供一个函数,该函数使用NSPredicate with format构造函数中的id值,该构造函数需要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
}
}
我认为你不应该试图让其他类型的人也适应他们。报告说: 注意:该协议是公共的,但其要求是stdlib专用的。 这是因为有一些API在CVarArg实例上运行,但不支持在标准库之外定义与CVarArg的一致性
stdlib在很多方面都很特殊,并且比用户代码更深入地嵌入到构建系统中。这方面的一个例子是,许多stdlib函数可以内联到您自己的代码中,这在其他情况下不可能跨越模块边界。我看不出这有什么实际价值,有更好的方法使用
va_list
参数。然而,我认为这个问题仍然有一些优点,因为它探索了ObjectiveC Swift集成的边缘。编码可以引用。如果你能解释你想做什么,我们可以帮你more@CodeDifferent我已经更新了问题以提供更多上下文。您是否可以不使用NSPredicate的arrayArgument init?-init(format predicateFormat:String,argumentArray arguments:[AnyObject]?)
No我得到一个生成错误类型为'Self.IdentityType'的值与预期的元素类型'AnyObject'不符。
您的协议没有继承自NSObjectProtocol,它应该会解决这个问题。无论如何,结构和枚举可能无法与NSPredicate很好地混合。实际上,您可以将其强制转换为AnyObject,因为它是此扩展中的NSManagedObject。