在UIScrollView中进行分页是一个很棒的功能,我需要的是将分页设置为较小的距离,例如我希望我的UIScrollView页面的大小小于UIScrollView的帧宽.谢谢
是否可以从Objective-C调用Swift中协议扩展中定义的方法?
例如:
protocol Product {
var price:Int { get }
var priceString:String { get }
}
extension Product {
var priceString:String {
get {
return "$\(price)"
}
}
}
class IceCream : Product {
var price:Int {
get {
return 2
}
}
}
Run Code Online (Sandbox Code Playgroud)
实例的价格字符串IceCream是'$ 2'并且可以在Swift中访问,但是该方法在Objective-C中不可见.编译器抛出错误'No visible @interface for'FlowCream'声明选择器......'.
在我的配置中,如果方法是直接在Swift对象的实现中定义的,那么一切都按预期工作.即:
protocol Product {
var price:Int { get }
var priceString:String { get }
}
class IceCream : Product {
var price:Int {
get {
return 2
}
} …Run Code Online (Sandbox Code Playgroud) 我有以下类层次结构:
class ScrollableViewController: UIViewController, UITableViewDelegate { // ... }
Run Code Online (Sandbox Code Playgroud)
这实现了一种UITableViewDelegate协议方法,例如tableView:willDisplayCellAt:
在我的SpecificScrollableViewController继承自的类中,ScrollableViewController新的可选协议方法不再被调用,例如tableView(_:heightForRowAt:)
我正在尝试使用条件扩展创建MKMapViewDelegate的默认实现,如下所示:
extension MKMapViewDelegate where Self: NSObject {
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
...
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译代码时,我得到了警告
非'@ objc'方法'mapView(_:viewFor :)'不满足'@objc'协议'MKMapViewDelegate'的可选要求
我期望NSObject对'Self'的一致性意味着警告不会发生.除了警告之外,即使委托实例是UIViewController并且因此符合NSObject,也不会调用委托方法.
我是否误解了"哪里"在扩展中的作用?
我已将以下内容放入 Playground 中以尝试理解这一点,但我只是不这样做:
import Foundation
@objc protocol Sample {
var value: Int { get set }
func increase()
func decrese()
}
extension Sample {
func increase() {
value += 1
}
func decrease() {
value -= 1
}
}
class Test: Sample {
var value: Int = 0
}
Run Code Online (Sandbox Code Playgroud)
class该错误出现在声明旁边Test:
非“@objc”方法“increase()”不满足“@objc”协议“示例”的要求
如果我在课堂上重新声明,increase()那么decrease()警告就会消失。或者如果我从协议中删除声明。有人可以解释一下吗?
编辑
我确实需要一个 Objective-C 类来遵守这个协议,因此一@objc开始就是这样。
swift ×4
ios ×2
objective-c ×2
cocoa-touch ×1
ios10 ×1
ipad ×1
iphone ×1
protocols ×1
swift3 ×1
uiscrollview ×1