Swift: 无法在协议扩展中使用变异方法
Swift: Can't use mutating method in Protocol Extension
我有 4 个视图控制器,需要根据用户屏幕宽度使用不同的图像。我正在尝试保持代码干燥并使用协议扩展。
以下是我的协议:
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
}
如何使用协议扩展来检测屏幕宽度并为我提供 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
之外是非法的。
至于你在这里需要什么,这一切似乎都太过分了。为什么将其扩展到带有协议的 viewControllers?您有一个 returns 图像名称的函数——可以在任何地方(只是一个免费函数,而不是 class)。
然后,在 viewControllers 中,将图像视图的图像设置为该函数返回的名称。
扩展是为 class 提供更多接口的一种方式——您不能让 class 仅通过扩展自动调用方法。
我有 4 个视图控制器,需要根据用户屏幕宽度使用不同的图像。我正在尝试保持代码干燥并使用协议扩展。
以下是我的协议:
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
}
如何使用协议扩展来检测屏幕宽度并为我提供 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
之外是非法的。
至于你在这里需要什么,这一切似乎都太过分了。为什么将其扩展到带有协议的 viewControllers?您有一个 returns 图像名称的函数——可以在任何地方(只是一个免费函数,而不是 class)。
然后,在 viewControllers 中,将图像视图的图像设置为该函数返回的名称。
扩展是为 class 提供更多接口的一种方式——您不能让 class 仅通过扩展自动调用方法。