在Swift中有可能吗?如果没有,那么有解决方法吗?
我倾向于只将必需品(存储属性,初始化器)放入我的类定义中,并将其他所有内容移动到自己的extension类中,有点像extension我将与之合并的每个逻辑块// MARK:.
例如,对于UIView子类,我最终会得到与布局相关的东西的扩展,一个用于订阅和处理事件等等.在这些扩展中,我不可避免地必须覆盖一些UIKit方法,例如layoutSubviews.我从未注意到这种方法有任何问题 - 直到今天.
以此类层次结构为例:
public class C: NSObject {
public func method() { print("C") }
}
public class B: C {
}
extension B {
override public func method() { print("B") }
}
public class A: B {
}
extension A {
override public func method() { print("A") }
}
(A() as A).method()
(A() as B).method()
(A() as C).method()
Run Code Online (Sandbox Code Playgroud)
输出是A B C.这对我来说没什么意义.我读到有关静态分派的协议扩展,但这不是协议.这是一个常规类,我希望在运行时动态调度方法调用.显然,呼叫C至少应该动态调度和产生C?
如果我删除继承NSObject …
我搜索了一些帖子,我想我不能在swift下编写扩展名,并用Objective-C代码调用它,对吧?
@objc like属性只支持方法,类,协议?
我想创建现有swift类的类别,但IDE中没有选项可以这样做.
知道swift项目中是否存在类别?或者如何在swift项目中实现类似的功能?
我想使用Accelerate框架扩展[Float]和[Double],但每个都需要不同的实现.
我试过了明显的事:
extension Array<Float> {
}
Run Code Online (Sandbox Code Playgroud)
并得到此错误:
"必须在非特定的泛型类型'Array'上声明约束扩展,并使用'where'子句指定的约束"
以这种方式扩展Swift 2中的泛型类型是否可行?
我现在已经按预期运行了代码.这是一个使用Accelerate框架显示总和的示例.
extension _ArrayType where Generator.Element == Float {
func quickSum() -> Float {
var result: Float = 0
if var x = self as? [Float] {
vDSP_sve(&x, 1, &result, vDSP_Length(x.count))
}
return result
}
}
extension _ArrayType where Generator.Element == Double {
func quickSum() -> Double {
var result: Double = 0
if var x = self as? [Double] {
vDSP_sveD(&x, 1, &result, vDSP_Length(x.count))
}
return result
}
}
Run Code Online (Sandbox Code Playgroud) 您可以像这样创建一个String扩展:
extension String {
func someFunc -> Bool { ... }
}
Run Code Online (Sandbox Code Playgroud)
但是如果你想将它应用于可选字符串呢?
var optionalString :String? = ""
optionalString!.someFunc() /* String? does not have a member someFunc */
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Array的扩展,它允许将一个可选的T数组转换成一个非可选的T数组.
例如,这可以写成这样的自由函数:
func removeAllNils(array: [T?]) -> [T] {
return array
.filter({ $0 != nil }) // remove nils, still a [T?]
.map({ $0! }) // convert each element from a T? to a T
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法将其作为扩展工作.我试图告诉编译器扩展只适用于可选值的数组.这是我到目前为止:
extension Array {
func filterNils<U, T: Optional<U>>() -> [U] {
return filter({ $0 != nil }).map({ $0! })
}
}
Run Code Online (Sandbox Code Playgroud)
(它不编译!)
protocol Car {
var wheels : Int { get set}
init(wheels: Int)
}
extension Car {
init(wheels: Int) {
self.wheels = wheels
}
}
Run Code Online (Sandbox Code Playgroud)
on self.wheels = wheels我得到了错误
Error: variable 'self' passed by reference before being initialized
Run Code Online (Sandbox Code Playgroud)
如何在协议扩展中定义初始化程序?
不知道这里发生了什么,这似乎应该是非常直接的.我有一个可变var的协议,一个带有变异函数的扩展.在testClass.testFunc中出现问题,当我尝试使用扩展中声明的mtkAnimQueAppend时,我得到这个错误:"不能在不可变值上使用变异成员:'self'是不可变的.
protocol MTKAnimateValueDelegate {
var mtkAnimQue:[MTKAnimateValue]? {get set}
}
extension MTKAnimateValueDelegate {
///Adds element to que
mutating func mtkAnimQueAppend(element:MTKAnimateValue) {
if mtkAnimQue != nil {
mtkAnimQue?.append(element)
} else {
mtkAnimQue = [element]
}
}
}
class testClass: MTKAnimateValueDelegate {
var mtkAnimQue:[MTKAnimateValue]?
func testFunc() {
var animValue = MTKAnimateValue(fromValue: 10, toValue: 20, inSeconds: 2)
animValue.isAnimating = true
mtkAnimQueAppend(animValue) //ERROR: "Cannot use mutating member on immutable value: 'self' is immutable
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试进行此扩展:
extension UIViewController
{
class func initialize(storyboardName: String, storyboardId: String) -> Self
{
let storyboad = UIStoryboard(name: storyboardName, bundle: nil)
let controller = storyboad.instantiateViewControllerWithIdentifier(storyboardId) as! Self
return controller
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到编译错误:
错误:无法将'UIViewController'类型的返回表达式转换为返回类型'Self'
可能吗?我也想成为init(storyboardName: String, storyboardId: String)
swift-extensions ×10
swift ×9
swift2 ×5
generics ×2
protocols ×2
arrays ×1
ios ×1
ios9 ×1
objective-c ×1