我希望 Swift 使我能够在where块中为具有指定条件的类型创建扩展。我想象我可以使用依赖于具体泛型类型值 ( T) 的不同扩展来扩展相同的泛型类型。但不是。以下示例演示了我的问题:
protocol P {
associatedtype Prop
var property: Prop { get }
}
enum E<T: P> {
case single(T)
case double(T)
}
extension E: P where T.Prop == Int {
var property: Int {
switch self {
case .single(let o): return o.property
case .double(let o): return o.property * 2
}
}
}
extension E: P where T.Prop == String {
var property: String {
switch self {
case .single(let o): return o.property …Run Code Online (Sandbox Code Playgroud) 使用UML接口在UML中可视化Swift协议似乎是合理的.但是,我应该如何可视化为特定协议提供默认实现的扩展?我应该只使用<<extension>>ProtocolName继承自该协议的类吗?
如何将给定对象强制转换为类型和协议,以便调用某些定义为扩展名的方法
例如:
extension Identifiable where Self: NSManagedObject, Self: JsonParseDescriptor {
func someMethod() { }
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个从Core数据中检索到的对象,我想将它转换为上述协议,以便在其上调用someMethod.我可以使用转换为协议protocol<Identifiable, JsonParseDescriptor>,但是如何在其中包含NSManagedObejct类型呢?
谢谢
我已经阅读了Apple的Swift iBook(类型转换和协议)的相关部分,但我似乎找到了一种方法来指定对象是符合特定协议的特定类的实例.
作为一个例子tableView(_: , cellForRowAt: )我希望将由返回的单元格转换tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath)为UITableViewCell符合RLMEntityCapableCell协议的子类(只是指定构造item函数有一个变量,称为该实例Object,或其子类之一).
这条路线有效,但双重铸造似乎过度:
protocol RLMEntityCapableCell: class {
var item: Object { get set }
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath) as! RLMEntityCapableCell // Cast here so we can set item
cell.item = items[indexPath.row]
return cell as! UITableViewCell // Cast again so the return type is right… …Run Code Online (Sandbox Code Playgroud) 请将问题读到最后,因为它似乎是许多类似其他人的副本,但事实并非如此.大多数其他问题使用带let关键字的闭包来捕获对象init之前的弱或无主自我.我不.
我的代码:
class Singleton : ObserverProtocol {
static let shared = Singleton()
private let obs : Observer = Observer.init()
private init() { self.obs.responder = self }
func observe(_ object : Any) {}
fileprivate class Observer : NSObject {
unowned var responder : ObserverProtocol!
func observe(_ obj : Any) {
self.responder.observe(obj)
}
}
}
fileprivate protocol ObserverProtocol : class {
func observe(_ object : Any)
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我会突出显示错误 unowned var responder : ObserverProtocol!
'unowned'可能只适用于类和类绑定协议类型,而不是'ObserverProtocol!'
如果我unowned改为weak我可以编译.
显然有一些 …
是否有特定原因限制我们在protocol声明中提供计算属性?因为我们只有机会将这些计算属性设置extension为protocol.
单词 -> 代码:
为什么这不起作用-(背后的逻辑是什么)
protocol GridableGraph {
var yTick: Float { get }
var yTicksCount: Int { get }
var xTick: Float{ get }
var xTicksCount: Int { get }
var maxYValue: Float { return Float(yTicksCount - 1) * yTick }
var maxXValue: Float { return Float(xTicksCount - 1) * xTick }
}
Run Code Online (Sandbox Code Playgroud)
虽然这确实
protocol GridableGraph {
var yTick: Float { get }
var yTicksCount: Int { get }
var xTick: Float{ get …Run Code Online (Sandbox Code Playgroud) 在 Swift 中,以下代码编译没有问题。
protocol P1 {
associatedtype T = Int
}
protocol P2 {
typealias T = Int
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这些似乎表现得几乎相同。我注意到的唯一区别是对何时可以使用有额外的限制,P1因为它具有关联类型。特别是,let x: P1是一个错误而let x: P2很好。
这两种协议之间的实际区别是什么?它们在编译代码中的处理方式不同吗?最后,使用P1而不是有优势P2吗?
为清楚起见编辑:
我知道关联类型和类型别名之间的工作差异,所以我很惊讶你甚至可以给关联类型一个固定值。这似乎违背了关联类型的全部目的。我想知道是否有任何实用程序可以为关联类型提供固定值,并且我想知道这两个协议在编译后是否不同。
我试图让斯威夫特协议,我可以使用UILabel,UITextField以及UITextView结合了他们text,attributedText和font性能。
然而,不幸的是,这三个类与它们是否为这些属性使用可选类型或隐式解包的可选类型不一致。
例如,如果我创建此协议:
protocol MyProtocol: class {
var font: UIFont? { get set }
}
Run Code Online (Sandbox Code Playgroud)
我应用它:
extension UILabel: MyProtocol { }
extension UITextField: MyProtocol { }
extension UITextView: MyProtocol { }
Run Code Online (Sandbox Code Playgroud)
它适用于UITextFieldandUITextView但是UILabel的font属性是UIFont!,所以编译器说不UILabel符合MyProtocol.
此外,textandattributedText是可选的 ( String?) for UILabelandUITextField但隐式解包 for UITextView( String!)。因此,对于所有三个属性,哪些使用可选项以及哪些使用隐式展开的可选项甚至不一致。
那么我不得不font在协议中重命名为例如。uiFont …
any我对在新的 Xcode beta 中看到的有关Swift新语法的错误感到有点困惑。
我有一个采用 的视图any Hashable,并且我试图将其传递给采用参数的参数Hashable。但是,我从 Xcode 收到此错误:Type 'any Hashable' cannot conform to 'Hashable'。我不明白为什么会这样,因为我认为 anany Hashable本质上是一个类型擦除的 Hashable,对吗?
这是一个完整的代码示例来说明我正在尝试的内容:
struct AwesomeNavigationLink: View {
var itemToLinkTo: any Hashable
var label: String
var body: some View {
NavigationLink(value: itemToLinkTo) {
Text(label)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致 NavigationLink 行出现上述错误。
我的问题是:我应该能够将 a 传递any Hashable给 aHashable吗?如果是这样,怎么办,或者这是一个错误?如果没有,为什么?提前致谢!
我正在尝试在 Swift 5.7 中创建一个Codable结构体[any Protocol]
struct Account: Codable {
var id: String
var name: String
var wallets: [any Wallet]
}
protocol Wallet: Codable {
var id: String { get set }
//... other codable properties
}
Run Code Online (Sandbox Code Playgroud)
但是,即使Wallet符合Codable
类型“帐户”不符合协议“可解码”
类型“帐户”不符合协议“可编码”
是否可以做出any符合Codable?
或者 Swift 5.7 仍然无法做到这一点?
编辑:正如回答的那样,您必须实现自己的一致性。这就是我的做法:
protocol Wallet: Identifiable, Codable {
var id: String { get set }
}
struct DigitalWallet: Wallet {
var id: String
// other properties …Run Code Online (Sandbox Code Playgroud) swift ×10
swift-protocols ×10
ios ×4
swift3 ×2
codable ×1
core-data ×1
generics ×1
type-alias ×1
uilabel ×1
uml ×1