使用扩展代码时出现以下错误,我不确定他们是否要求使用其他运算符或根据Internet搜索修改表达式中的值.
错误:%不可用:改为使用truncatingRemainder
扩展代码:
extension CMTime {
var durationText:String {
let totalSeconds = CMTimeGetSeconds(self)
let hours:Int = Int(totalSeconds / 3600)
let minutes:Int = Int(totalSeconds % 3600 / 60)
let seconds:Int = Int(totalSeconds % 60)
if hours > 0 {
return String(format: "%i:%02i:%02i", hours, minutes, seconds)
} else {
return String(format: "%02i:%02i", minutes, seconds)
}
}
}
Run Code Online (Sandbox Code Playgroud)
设置分钟和秒变量时会发生错误.
在Swift 2中,似乎在调用函数时并不总是需要第一个参数名称.现在在Swift 3中,调用函数时需要第一个参数名称.例如:
func frobnicate(runcible: String) {
print("Frobnicate: \(runcible)")
}
Run Code Online (Sandbox Code Playgroud)
Swift 2.2允许通过简单输入来调用函数:
Frobnicate("Station")
Run Code Online (Sandbox Code Playgroud)
Swift 3似乎要求我们使用方法的第一个参数名称,例如:
Frobnicate(runcible:"Station")
Run Code Online (Sandbox Code Playgroud)
Swift 3适用于所有功能和方法,还是仅适用于某些情况?
我正在关注Swift的教程,我注意到作者使用var而不是let在声明@IBOutlet变量时.所以我很好奇为什么我不能使用,let因为即使对象是常量,对象的属性仍然是可变的,或者不是这样的情况?
错误使用时,Xcode中显示let为
@IBOutlet属性要求属性是可变的
但我很困惑,因为它questionLabel是一个UILabel对象,不一定是对象的属性.或者questionLabel对象是当前viewController的属性?
import UIKit
class ViewController: UIViewController {
@IBOutlet let questionLabel: UILabel!
}
Run Code Online (Sandbox Code Playgroud)
如果我过度分析,请提前感谢您.
通过对StackOverflow的研究,我了解到这个错误是由于尝试绑定一个不是可选的类型引起的,但是在这种情况下没有意义,因为它使用了guard.这是我的代码:
func animateTransition(_ transitionContext: UIViewControllerContextTransitioning) {
// Here, we perform the animations necessary for the transition
guard let fromVC = transitionContext.viewController(forKey: UITransitionContextFromViewControllerKey) else { return }
let fromView = fromVC.view
guard let toVC = transitionContext.viewController(forKey: UITransitionContextToViewControllerKey) else { return }
let toView = toVC.view
guard let containerView = transitionContext.containerView() else { return }
if self.presenting {
containerView.addSubview(toView)
}
let animatingVC = self.presenting ? toVC : fromVC
let animatingView = animatingVC.view
let appearedFrame = transitionContext.finalFrame(for: animatingVC)
var alpha: CGFloat = 1 …Run Code Online (Sandbox Code Playgroud) 我问这个问题的原因是因为我正在阅读使用委托的教程。根据我从其他在线教程/文章中读到的内容,据我所知,这个特定的教程尚未创建保留周期。我还使用 Instruments(内存泄漏和僵尸)对其进行了测试,以确保没有内存泄漏。
我试图弄清楚一个类是否只是简单地符合协议,这是否会创建一个引用?
我认为不会,但我想确定一下。
以下是创建委托成员的协议和类:
import Foundation
import CoreBluetooth
protocol TransferServiceScannerDelegateProtocol: NSObjectProtocol {
func didStartScan()
func didStopScan()
func didTransferData(data: NSData?)
}
class TransferServiceScanner: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
var centralManager: CBCentralManager!
var discoveredPeripheral: CBPeripheral?
var data = NSMutableData()
weak var delegate: TransferServiceScannerDelegateProtocol?
init(delegate: TransferServiceScannerDelegateProtocol?) {
super.init()
centralManager = CBCentralManager(delegate: self, queue: nil)
self.delegate = delegate
}
//start of cbCentralDelegate method
func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch central.state {
case .poweredOn:
print("Central is powered on...")
break
case .poweredOff:
print("Central is powered off...") …Run Code Online (Sandbox Code Playgroud) 以下行崩溃了该程序:
let cell = tableView.dequeueReusableCellWithIdentifier("ItemCell", forIndexPath: NSIndexPath(forRow: 0, inSection: 0)) as! ItemCell
Run Code Online (Sandbox Code Playgroud)
控制台日志显示以下错误:
"caught "NSInternalInconsistencyException", "request for rect at invalid index path (<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0})"
Run Code Online (Sandbox Code Playgroud)
这是我检查过的一些项目清单:
这是完整的代码:
import XCTest
@testable import ToDo
class ItemCellTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. …Run Code Online (Sandbox Code Playgroud) 在研究了 stackoverflow 关于 Swift 中下划线的内容后,我明白下划线意味着 a) 忽略这个函数,b) 在使用该方法时可以省略参数名称。我不明白的是,如果我们将变量分配给下划线会发生什么?通过为变量分配下划线,这可以消除来自 Xcode 的编译器警告,该警告显示“初始化程序的结果未使用”,但如果您不以任何方式使用此变量,则不会显示警告。
这个变量是否仍然被创建并存储在内存中,或者是否被编译器一起忽略,就好像它是一行被注释掉的代码一样?
例如:
func test_ToDoItem_TakesTitle(){
let firstToDoItem = ToDoItem(title: "First Instance Title")
_ = ToDoItem(title: "First ToDoItem instance")
XCTAssertEqual(firstToDoItem.title, "First Instance Title")
}
Run Code Online (Sandbox Code Playgroud)
以下代码行是创建并存储在内存中还是被忽略:
_ = ToDoItem(title: "First ToDoItem instance")
Run Code Online (Sandbox Code Playgroud)
希望这个问题有意义,因为我想注意 Xcode 中每块内存的使用方式。
以下代码引发以下错误:"类型字符串的值没有成员componentsSeparatedByCharactersInSet"
此代码来自另一个在swift版本1或2中运行但之前不再有效的项目.
import Foundation
extension String {
func split() -> [String] {
return self.componentsSeparatedByCharactersInSet(
CharacterSet.whitespaceAndNewlineCharacterSet())
.filter({$0 != ""});
}
}
extension Array {
func unique<T: Equatable>() -> [T] {
var uniqueValues = [T]();
for value in self {
if !contains(uniqueValues, value as T) {
uniqueValues.append(value as! T);
}
}
return uniqueValues;
}
func first<T>(test:(T) -> Bool) -> T? {
for value in self {
if test(value as! T) {
return value as? T;
}
}
return nil;
}
}
Run Code Online (Sandbox Code Playgroud) 在Swift 3之前的某个时刻,这段代码可以在没有任何编译错误的情况下工作,但是在转换为Swift 3之后,这段代码没有编译,我也不完全理解值类型是如何不同的.
给出的错误是expression pattern of type 'CountableClosedRange<Int>' cannot match values of type 'Int'针对我试图在switch语句中使用不同值范围的切换情况:
switch hour {
case 0 ... 11:
greetingStatement.text = "Good Morning"
case 12 ... 24:
greetingStatement.text = "Good Evening"
default:
greetingStatement.text = "Hello"
}
Run Code Online (Sandbox Code Playgroud)
这是完整的代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var userInput: UITextField!
@IBOutlet weak var usertOutput: UILabel!
@IBOutlet weak var tapMeAfterEnteringYourName: UIButton!
@IBOutlet weak var greetingStatement: UILabel!
@IBOutlet weak var letsGetStartedLabel: UILabel!
@IBOutlet weak var ballonsImageView: UIImageView!
@IBOutlet weak var …Run Code Online (Sandbox Code Playgroud) 我相信我遇到了Swift版本问题,但我不太确定.代码可以在我的Xcode平台上运行,但不能在在线swift编译器中运行.有没有其他人遇到这个问题或知道我可以用什么来替换我检查字符的以下行:
if i == 0 || !((line.range(of: ":") != nil))
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import Foundation
func hackTheString(line: String){
var maxOpen: Int = 0
var minOpen: Int = 0
minOpen = 0
maxOpen = 0
let i = 0
while i < line.characters.count {
for character in line.characters {
if character == "(" {
maxOpen += 1
if i == 0 || !((line.range(of: ":") != nil)) {
minOpen += 1
}
}
else if character == ")"{
minOpen = max(0,minOpen-1)
if i == …Run Code Online (Sandbox Code Playgroud)