我一直在努力寻找在扩展中实现存储属性的最佳方法,并遇到了这个问题:Swift扩展存储属性的替代方案.但是,我没有在讨论中或其他任何地方找到原因.有没有理由在Swift中不允许存储属性?如果是这样,原因是什么?
Swift中的结构可以包含函数并且可以包含扩展.凉!看起来像一个简洁的方法,使这个功能可用于更多的类,并减少参数传递.这是函数最初在地图视图控制器中查看的方式:
func expandTrackRectToCoordinate(coordinate : CLLocationCoordinate2D) {
let point = MKMapPointForCoordinate(coordinate)
let newRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)
if MKMapRectIsNull(trackRect) {
trackRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)
} else {
trackRect = MKMapRectUnion(trackRect, newRect)
}
}
Run Code Online (Sandbox Code Playgroud)
trackRect 是该类的MKMapRect成员.
MKMapRect扩展为包括每个点,以便可以根据需要将地图重置为整个区域,显示所有点.
我试图将它作为MKMapRect的扩展(部分 - 显示直到错误):
extension MKMapRect {
func expandToIncludeCoordinate(coordinate : CLLocationCoordinate2D) {
let point = MKMapPointForCoordinate(coordinate)
let newRect = MKMapRectMake(point.x, point.y, 0.0, 0.0)
if MKMapRectIsNull(self) {
self.origin = point <-------- Cannot assign to 'origin' in 'self'
self.size = CGSizeZero
} else {
Run Code Online (Sandbox Code Playgroud)
我没想到能够分配给自己,但我确实希望能够分配给结构的成员.如何才能做到这一点?
我正在使用像这样的Swift扩展@IBInspectable来设置边框颜色UIButton:
extension UIButton {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
layer.masksToBounds = newValue > 0
}
}
}
Run Code Online (Sandbox Code Playgroud)
...但我也想拥有按钮状态的selectedBorderColor属性.Selected.这可能是这样的扩展吗?我是否必须以UIButton某种方式继承并检查按钮状态?
extension UIButton {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
layer.masksToBounds = newValue > 0
}
}
//This is what I want to do...
@IBInspectable var selectedBorderWidth: CGFloat {
get {
return layer.borderWidth
} …Run Code Online (Sandbox Code Playgroud) 如何扩展swift数组以访问特定类型的成员?
如果数组包含从同一个超类继承的多个类的实例,则这是相关的.理想情况下,它会适当地强制执行类型检查.
使用该filter(_:)方法工作正常,但确实强制类型安全.例如:
protocol MyProtocol { }
struct TypeA: MyProtocol { }
struct TypeB: MyProtocol { }
let myStructs:[MyProtocol] = [ TypeA(), TypeA(), TypeB() ]
let filteredArray = myStructs.filter({ $0 is TypeA })
Run Code Online (Sandbox Code Playgroud)
在filteredArray包含了正确的价值观,但类型仍然[MyProtocol]没有[TypeA].我希望更换最后一个let filteredArray = myStructs.filter({ $0 is TypeA }) as! [TypeA]可以解决这个问题,但项目失败了EXEC_BAD_INSTRUCTION,我不理解.也许类型转换阵列是不可能的?
理想情况下,此行为可以包含在数组扩展中.以下内容无法编译:
extension Array {
func objectsOfType<T:Element>(type:T.Type) -> [T] {
return filter { $0 is T } as! [T]
}
}
Run Code Online (Sandbox Code Playgroud)
这里似乎至少有两个问题:类型约束T:Element似乎不起作用.我不确定基于泛型类型添加约束的正确方法是什么.我的意图是说T …
我想创建一个具有.containsAPI的所有类型的扩展.
例如,我为字符串做了这个,但是想为所有类型扩展它:
func within(values: [String]) -> Bool {
return values.contains(self)
}
Run Code Online (Sandbox Code Playgroud)
有了这个,而不是这个:
["abc", "def", "ghi"].contains("def")
为方便起见,我可以这样做:
"def".within(["abc", "def", "ghi"])
但是我想和这样的事情一起工作,例如:
[.North, .South].contains(.West)
所以我可以用枚举来做到这一点:
let value = .West
value.within([.North, .South])
Run Code Online (Sandbox Code Playgroud)
是否可以为此方案创建广泛的扩展?
我正在尝试创建一个协议,包含使用UIImagePickerController的过程,使其在我的应用程序中更流线型.我基本上有这样的事情:
public protocol MediaAccessor : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func mediaCaptured(title: String, fileData: NSData, fileType: String)
}
Run Code Online (Sandbox Code Playgroud)
和一个扩展,它完成了请求权限和处理委托方法的所有繁重工作:
public extension MediaAccessor where Self : UIViewController {
public func captureMedia() {
//All sorts of checks for picker authorization
let picker = UIImagePickerController()
picker.delegate = self
self.presentViewController(picker, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
//implementation of the delegate in extension
//even though everything compiles, this method is not called on picker completion
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试扩展struct已经存在的内容struct.当我写下面的代码时,我明白了
声明仅在文件范围内有效.
struct A {
struct AA {
}
}
extension A {
extension AA {
}
}
Run Code Online (Sandbox Code Playgroud)
在扩展中编写扩展名是否无效?
我在 swift 扩展中有一个问题:
protocol Racer {
var speed: Double { get }
}
extension Sequence where Iterator.Element == Racer {
func fastest() -> Iterator.Element? {
return self.max(by: { (a: Iterator.Element, b: Iterator.Element) -> Bool in
return a.speed < b.speed
})
}
}
extension Sequence where Iterator.Element: Racer {
func bla() -> Void {
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道它们之间有什么区别。实际上,类型的数组[Racer]没有bla()功能。
编辑1?还有一个问题,假设我们有一个结构体符合Racer
struct Human: Racer {
var speed: Double
}
Run Code Online (Sandbox Code Playgroud)
如果我们有一个Array<Racer>:
let me = Human(speed: 99999)
let you …Run Code Online (Sandbox Code Playgroud) 我正在编写一个具有readOnly标签的协议.我想扩展它并给它一个默认的实现,其中符合类型是a UITextView.
码:
protocol CountingView {
var keyboardLabel : UILabel {get}
}
extension CountingView where Self : UITextView {
var keyboardLabel : UILabel {
get {
let label = UILabel()
label.textColor = UIColor.white
label.translatesAutoresizingMaskIntoConstraints = false
return label
}
private (set) {
keyboardLabel = newValue
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我添加private之前,set我得到以下错误.
期望'get','set','willSet'或'didSet'关键字来启动访问者定义
我查看了这个错误的其他问题,但没有发现它们与我的相关.
我的应用程序有一些自定义颜色,现在它像字典一样保存,但我认为这不是一个好主意,我想用自定义颜色对UIColor进行扩展.
这可能看起来像这样
var newColor = UIColor.MyColor // like UIColor.white
Run Code Online (Sandbox Code Playgroud)
也许我应该用扩展名添加我的颜色枚举?