gpt4 book ai didi

Swift:无法在协议(protocol)扩展中使用变异方法

转载 作者:行者123 更新时间:2023-11-30 13:24:23 25 4
gpt4 key购买 nike

我有 4 个 View Controller ,需要根据用户屏幕宽度使用不同的图像。我试图保持代码干燥并使用协议(protocol)扩展。

以下是我的协议(protocol):

import UIKit

enum ScreenWidths: CGFloat {
case iPhone455s = 320.0
case iPhone6 = 375.0
case iPhone6Plus = 414.0
}

protocol ScreenSizeProtocolExt {
mutating func setupBG() -> String
}


extension ScreenSizeProtocolExt {
mutating func setupBG() -> String {
let imageName: String
let userScreenWidth = UIScreen.mainScreen().bounds.width

switch userScreenWidth {
case ScreenSizeWidth.iPhone455s.rawValue:
imageName = "imageA"
case ScreenSizeWidth.iPhone6.rawValue:
imageName = "imageB"
case ScreenSizeWidth.iPhone6Plus.rawValue:
imageName = "imageC"
default:
imageName = "imageAll"
}

return imageName
}
}

现在我正在尝试使用它:

extension myViewController: ScreenSizeProtocolExt {

let imageToUse = setupBG()
// Here is get an error: 'Use of instance member 'setupBG' on type 'inout Self'; did you mean to use a value of type 'inout self' instead?
let image = UIImage(named: imageToUse)
imageView.image = image

}

如何使用协议(protocol)扩展来检测屏幕宽度并为我提供正确的imageName以供使用。

最佳答案

这段代码:

extension myViewController: ScreenSizeProtocolExt {    
let imageToUse = setupBG()
// Here is get an error: 'Use of instance member 'setupBG' on type 'inout Self'; did you mean to use a value of type 'inout self' instead?
let image = UIImage(named: imageToUse)
imageView.image = image
}

不合法。主要的是扩展程序无法添加新的存储属性 - 所以你不能这样做:

let imageToUse = setupBG()

在扩展中。

另外,这一行:

imageView.image = image 

func之外是非法的。

至于你在这里需要什么,这一切似乎都太过分了。为什么要使用协议(protocol)将其扩展到 View Controller ?您有一个返回 imageName 的函数——它可以在任何地方(只是一个免费函数,而不是在类中)。

然后,在 viewControllers 中,只需将 ImageView 的图像设置为此函数返回的名称即可。

扩展是为类提供更多接口(interface)的一种方式 - 您不能仅通过扩展使类自动调用方法。

关于Swift:无法在协议(protocol)扩展中使用变异方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37399281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com