我正在尝试实现一个简单的多委托情况:
protocol Subscribable: class {
associatedtype Subscriber: AnyObject
var subscribers: NSHashTable<Subscriber> { get }
}
protocol ControllerSubscriber: class {
func controllerDidSomething()
}
class Controller: Subscribable {
typealias Subscriber = ControllerSubscriber
var subscribers = NSHashTable<Subscriber>.weakObjects() // Error
}
Run Code Online (Sandbox Code Playgroud)
错误:不支持使用'ControllerSubscriber'作为符合协议'AnyObject'的具体类型.
我的问题是:
当然,我该如何解决这个问题?从实际的解决方案而不是解决方案.
我很难理解Swift的泛型系统.我似乎经常遇到这样看似简单的情况.我只是想把一个符合协议的东西放到另一个东西:(.我想知道我的想法出错了所以我可以解决它,而不必再看到这些错误.
有这个相关的问题,但请注意答案只给出解决方法,没有解释或解决方案.
我想在用户的照片库上做一些工作.由于库可能很大,我想在后台进行.我想知道是否可以安全地执行资产提取(例如PHAsset.fetchAssets)并在后台处理它们?
我现在只需要资产元数据.
这样的事情是安全的:
class ViewController: UIViewController {
var cachedResult = [Any]()
func doBackgroundCalculationsOnPhotos(completionHandler: ([Any]) -> ()) {
DispatchQueue.global(qos: .userInitiated).async {
let photos = PHAsset.fetchAssets(with: .image, options: nil)
var result = [Any]()
photos.enumerateObjects({ asset, _, _ in
result.append(calculateSomething(asset))
})
DispatchQueue.main.async {
self.cachedResult = result
completionHandler(result)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有任何文档参考我可以了解照片框架和后台访问?
我正在我的 iOS 应用程序中开发一个标准的 Action Extension,Xcode 模板包含以下几行:
@IBAction func done() {
// Return any edited content to the host app.
// This template doesn't do anything, so we just echo the passed in items.
self.extensionContext!.completeRequest(returningItems: self.extensionContext!.inputItems, completionHandler: nil)
}
Run Code Online (Sandbox Code Playgroud)
returningItems给的目的是completeRequest什么?我想要一个接受序列的函数Int.这是我想写的:
func process(items: Sequence<Int>) {
items.forEach { ... }
}
Run Code Online (Sandbox Code Playgroud)
错误:"无法专门化非泛型类型'序列'".
更正(我认为):
func process<S: Sequence>(items: S) where S.Iterator.Element == Int {
items.forEach { ... }
}
Run Code Online (Sandbox Code Playgroud)
相当多一些冗长.
我知道序列协议具有相关联的类型的Iterator,其具有Element.但我不太清楚为什么我必须以Int这种奇怪的方式解决这个问题.
使第一个版本不起作用但第二个版本不起作用的基本概念是什么?错误是什么意思?
我很难找到有关如何遵守MutableCollection. 谷歌在这个话题上完全是空的。
例如,我想为GMSPath/添加一致性GMSMutablePath:
import CoreLocation\nimport GoogleMaps\n\nextension GMSPath: RandomAccessCollection {\n\n public var startIndex: Int {\n return 0\n }\n\n public var endIndex: Int {\n return count\n }\n\n public func index(before i: Int) -> Int {\n return i-1\n }\n\n public func index(after i: Int) -> Int {\n return i+1\n }\n\n public subscript(position: Int) -> CLLocationCoordinate2D {\n return coordinate(at: UInt(position))\n }\n}\n\nextension GMSMutablePath: MutableCollection { // Error!\n\n public override subscript(position: Int) -> CLLocationCoordinate2D {\n get {\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试用圆角矩形掩盖视图UIBezierPath。我希望蒙版看起来与我刚刚设置时完全相同layer.cornerRadius:
let frame = CGRect(x: 0, y: 0, width: 80, height: 80)
let cornerRadius = 30
Run Code Online (Sandbox Code Playgroud)
使用cornerRadius:
let view = UIView(frame: frame)
view.layer.cornerRadius = cornerRadius
Run Code Online (Sandbox Code Playgroud)
使用UIBezierPath面膜:
let view = UIView(frame: frame)
let maskingShape = CAShapeLayer()
maskingShape.path = UIBezierPath(roundedRect: frame, cornerRadius: cornerRadius).cgPath
view.layer.mask = maskingShape
Run Code Online (Sandbox Code Playgroud)
生成的圆角矩形完全不同。标准cornerRadius按预期工作,而贝塞尔曲线路径仅捕捉到特定半径的完整圆。
显然,这是 iOS 7 的预期行为。
那么如何绘制带有贝塞尔曲线路径的标准圆角矩形呢?
我找到了这个类别,但这一定是个笑话吧?难道就没有更简单的办法吗?:(
相关问题。