gpt4 book ai didi

nsarray - 带有数组和 UIView 的 Swift for 循环中的注释错误

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:33 27 4
gpt4 key购买 nike

我认为采用小型 Obj-C 库并将其转换为 Swift 将是一个很好的学习实验。因为我最终想在应用程序中使用这个库,所以我在这里找到了 Path 应用程序菜单示例:https://github.com/yourabi/PathMenuExample

我认为我在转换和搜索答案方面做得很好,因为我刚刚开始使用 Obj-C 和 Swift。但现在我遇到了一个错误,我找不到解决方案。

ExpandableNavigation.swift

import Foundation
import UIKit;

class ExpandableNavigation: NSObject {

var mainButton: UIButton;
var menuItems: NSArray;
var radius: CGFloat;
var speed: CGFloat;
var bounce: CGFloat;
var bounceSpeed: CGFloat;
var expanded: Bool;
var transition: Bool;


init(menuItems: NSArray, mainButton: UIButton, radius: CGFloat) {
self.menuItems = menuItems;
self.mainButton = mainButton;
self.radius = radius;
self.speed = 0.15;
self.bounce = 0.225;
self.bounceSpeed = 0.1;
expanded = false;
transition = false;

super.init()

if self.mainButton != nil {
for view: UIView in self.menuItems {
view.center = self.mainButton.center;
}

self.mainButton.addTarget(self, action:"press", forControlEvents: UIControlEvents.TouchUpInside);
}
}

func expand() -> Void {
transition = true;

UIView.animateWithDuration(0.15, animations: {
self.mainButton.transform = CGAffineTransformMakeRotation(45.0 * M_PI/180)
})

for view: UIView in self.menuItems {
var index: Int? = findIndex(self.menuItems, valueToFind: view);
var oneOverCount: Float;
if self.menuItems.count <= 1 {
oneOverCount = 1.0;
} else {
oneOverCount = (1.0 / Float(self.menuItems.count - 1));
}
var indexOverCount: CGFloat = CGFloat(index!) * CGFloat(oneOverCount);
var rad: CGFloat = (1.0 - CGFloat(indexOverCount)) * 90.0 * CGFloat(M_PI) / 180.0;
var rotation: CGAffineTransform = CGAffineTransformMakeRotation(rad);
var x: CGFloat = (self.radius + self.bounce * self.radius) * rotation.a;
var y: CGFloat = (self.radius + self.bounce * self.radius) * rotation.c;
var center: CGPoint = CGPointMake(view.center.x + x, view.center.y + y);
UIView.animateWithDuration(self.speed,
delay: self.speed * indexOverCount,
options: UIViewAnimationOptions.CurveEaseIn,
animations: {
view.center = center;
},
completion: {(finished: Bool) in
UIView.animateWithDuration(self.bounceSpeed,
animations: {
var x: CGFloat = self.bounce * self.radius * rotation.a;
var y: CGFloat = self.bounce * self.radius * rotation.c;
var center: CGPoint = CGPointMake(view.center.x + x, view.center.y + y);
view.center = center;
});
if view == (self.menuItems.endIndex - 1) {
self.expanded = true;
self.transition = false;
}
})

}
}

func collapse() -> Void {
transition = true;

}

@IBAction func press(sender: AnyObject) {
if !self.transition {
if !self.expanded {
self.expand();
} else {
self.collapse();
}
}
}

func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? {
for (index, value) in enumerate(array) {
if value == valueToFind {
return index
}
}
return nil
}
}

ExpandableNavigation.swift 错误

错误:类型注释与上下文类型“AnyObject”不匹配

这个错误发生在 init() 和 expand() 方法中用于 View :self.menuItems 中的 UIView {我尝试制作数组 UIView[] 但这会导致其他地方出错。

ViewController.swift - 供引用

class ViewController: UIViewController {
@IBOutlet var expandNavMainButton: UIButton;
@IBOutlet var expandNavCheckInButton: UIButton;
@IBOutlet var expandNavReviewButton: UIButton;
@IBOutlet var expandNavPhotoButton: UIButton;
@IBOutlet var expandNavStatusButton: UIButton;
var expandableNavigation: ExpandableNavigation;

init(coder aDecoder: NSCoder!) {
var buttons: NSArray = [expandNavCheckInButton, expandNavReviewButton, expandNavPhotoButton, expandNavStatusButton];
var myRadius: CGFloat = 120.0
self.expandableNavigation = ExpandableNavigation(menuItems: buttons, mainButton: self.expandNavMainButton, radius: myRadius);
super.init(coder: aDecoder)
}

最佳答案

为了安全起见,Swift 不会为你做任何隐式转换。它不会在没有显式转换的情况下将 AnyObject(这是 NSArray 存储的类型)转换为 UIView。您应该执行以下操作:

for obj : AnyObject in menuItems {
if let view = obj as? UIView {
view.center = self.mainButton.center;
}
}

这会循环遍历带有 AnyObject 的菜单项数组,并在将其转换为一个 View 之前检查 obj 是否是一个 View 。

关于nsarray - 带有数组和 UIView 的 Swift for 循环中的注释错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24091370/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com